4

将多处理对象(队列、字典等)传递给多个 gevent 线程是否安全?由于它们实际上并没有同时运行,所以我认为没有问题。但是,我知道 gevent 不应该与多处理特别兼容。

4

3 回答 3

1

好处可能会丢失,标准线程队列实现了绿色线程可能会减慢速度的锁。值得庆幸的是,gevent 通常有自己但相似的构造。查看gevent.queue

于 2015-07-11T01:27:06.610 回答
1

不幸的是,目前似乎gevent与以下对象不兼容multiprocessing

有危险。和其他 mp 数据结构在mp.Queue内部使用信号量之类的东西:https ://github.com/python/cpython/blob/master/Lib/multiprocessing/queues.py#L48

Linux 下的信号量不是基于 fd 的,需要线程包装器来解除对主循环线程的阻塞。一般来说,如果事情不顺利,有可能用信号量完全阻塞主线程,无限地等待某个事件的发生。

(引用 GitHub 问题https://github.com/gevent/gevent/issues/1443

于 2019-08-09T13:10:32.813 回答
0

我会说它是一个线程安全的对象,那么它并不危险,但你应该始终认真考虑它。如果它不是线程安全的,您需要担心方法的可重入性以及不同对象操作不是原子的后果。有些对象是有状态的,它们需要在另一个线程进来之前完成某些操作。

于 2015-07-11T01:41:50.727 回答