Обмен данными с помощью pyzmq zero-copy
Я наткнулся на zeromq, когда искал эффективное решение для IPC в python; у меня есть несколько процессов python, которые должны выполнять некоторую интенсивную обработку данных из dict в главном процессе. Эти рабочие процессы только читают из дикт, только главный процесс может изменить дикт. Данные в диктанте изменятся, но атомарно через главный процесс.
В идеале у меня был бы кусок общей памяти, из которого все рабочие процессы могли бы читать дикт, к сожалению, это не представляется возможным в python.
Использование кэша, такого как redis или memcache, звучит как перебор (не хочу использовать TCP & pickling, чтобы просто поделиться чем-то, что у меня уже есть где-то в памяти в родном формате)..
Поэтому в качестве альтернативы я хотел бы использовать zeromq для передачи соответствующих данных от master dict к подписывающимся работникам, использующим сокет ZeroMQ IPC. Это означало бы, что мне (к сожалению) придется сериализовать соответствующую часть из master dict (используя msgpack?) и затем нажмите его, используя сообщение zmq. Я читал, что это можно сделать с помощью нулевого копирования, чтобы я не копировал данные дважды, это то, что автоматически происходит, если я использую copy=False на моей двоичной строке msgpacked? И это способ решить мою проблему, или у вас есть советы, как решить ее еще более эффективно?
Спасибо!
Martijn
1 ответ:
Да, если вы отправляете свои msgpacked байты с
copy=False
, то не будет никаких дополнительных копий данных в памяти для процесса отправки (то же самое касается принимающей стороны сcopy=False
).Обязательно проведите тесты производительности, поскольку стоимость более сложного механизма нулевого копирования часто больше, чем стоимость самой копии, пока сообщения не начнут становиться довольно большими (кроссовер около 10 кб на сообщение).
Альтернативный подход заключается в том, что вы можете просто использовать встроенную многопроцессорную обработку средства модуля для общих данных . Это не самое удивительное,но для довольно простых вещей это может сделать работу.