将多进程队列/字典等传递给绿色线程
把一个多进程对象(比如队列、字典等等)传给多个gevent线程,这样做安全吗?因为这些线程并不是同时在运行,所以我觉得应该没问题。不过,我知道gevent并不是特别和多进程兼容。
3 个回答
0
我想说,如果一个对象是线程安全的,那就没什么危险,但你还是要认真考虑这个问题。如果它不是线程安全的,你就得担心方法的重入性,以及不同对象操作不是原子的后果。某些对象是有状态的,它们需要在另一个线程介入之前完成特定的操作。
1
不幸的是,目前来看,gevent
和 multiprocessing
里的对象不太兼容:
这很危险。
mp.Queue
和其他的多进程数据结构内部使用了一些像信号量这样的东西:https://github.com/python/cpython/blob/master/Lib/multiprocessing/queues.py#L48在Linux下,信号量不是基于文件描述符的,这就需要用线程来包装,以便让主循环线程可以继续运行。一般来说,如果出现问题,信号量可能会让主线程完全阻塞,导致它无限期地等待某个事件发生。
(引用自GitHub问题 https://github.com/gevent/gevent/issues/1443)
1
这样做的好处可能会消失,因为标准的线程队列会使用锁,这样绿色线程可能会变得很慢。不过,幸运的是,gevent通常有自己类似的结构。你可以看看gevent.queue。