[zeromq-dev] 0MQ 1.0.1 Python Global Interpreter Lock patch?
Aamir M
intuitionist at gmail.com
Thu Oct 15 18:21:29 CEST 2009
Hello,
I am trying to use the 0MQ 1.0.1 Python API to send / recv 0MQ
messages in one Python thread while driving a GUI in another Python
thread. However, whenever I use the blocking send / recv 0MQ calls,
the whole Python process freezes and waits for network I/O (so the GUI
becomes non-responsive, etc). It seems that pyzmq.cpp
(http://github.com/sustrik/zeromq1/blob/master/libpyzmq/pyzmq.cpp) is
not thread friendly. I was able to get around the problem by modifying
the pyZMQ_receive and pyZMQ_send functions .... specifically, line 176
in pyzmq.cpp reads:
sent = self->api_thread->send (exchange, message, block);
I replaced this with:
Py_BEGIN_ALLOW_THREADS
sent = self->api_thread->send (exchange, message, block);
Py_END_ALLOW_THREADS
Similarly, I changed line 192 to:
int queue;
Py_BEGIN_ALLOW_THREADS
queue = self->api_thread->receive (&message, block);
Py_END_ALLOW_THREADS
In summary, I just simply the 0MQ C++ blocking calls with the Python
macros Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS, which are
described in http://docs.python.org/c-api/init.html ... These macros
release and reacquire the CPython Global Interpreter Lock.
Is this a bug in the 0MQ 1.0.01 library that should be patched? Or is
my patch somehow incorrect?
Thanks,
Aamir
More information about the zeromq-dev
mailing list