gevent池wait_available线程安全吗



所以我有一个10大小的函数,比如test和gevent池。

pool.Pool(size=10)
def test():
pool.wait_available(timeout=0.5)
pool.spawn(something)

如果函数测试由不同的线程调用,它会引起任何问题吗。我的意思是wait_available应该是线程安全的,但pool.spawn会有线程安全/竞争条件问题。我的意思是,假设已经有9个greenlet在运行,并且有几个请求调用测试函数。他们两个都会读取pool.wait_available,它不应该阻塞,但之后的pool.spown会使其中一个阻塞。

我只想确保pool.spawn不会阻塞超过指定的超时时间。我怎样才能做到这一点?

如果使用pool中的spawn,则不需要wait_available,因为spawn将在Pool的内部信号量中请求一个lock,该信号量用于跟踪运行的绿绿灯。只有当您使用apply_async时,才有例外。我将在这里解释这两种情况:
pool.Pool(size=10)
def test():
for i in xrange(20):
log('Processing {}'.format(i))
pool.spawn(something)
pool.join()
log('Done')

这个输出显示,它将以10为一组生成greenlets,因为池中包含10的空间:

1531531331: Processing 0
1531531331: Processing 1
1531531331: Processing 2
1531531331: Processing 3
1531531331: Processing 4
1531531331: Processing 5
1531531331: Processing 6
1531531331: Processing 7
1531531331: Processing 8
1531531331: Processing 9
1531531340: Processing 10
1531531340: Processing 11
1531531340: Processing 12
1531531340: Processing 13
1531531340: Processing 14
1531531340: Processing 15
1531531340: Processing 16
1531531340: Processing 17
1531531340: Processing 18
1531531340: Processing 19
1531531349: Done

相反,如果使用apply_Async而不是派生,则会强制所有调用同时运行。这里将有一个竞赛条件,让所有greeenlet立即开始执行。

1531531357: Processing 0
1531531357: Processing 1
1531531357: Processing 2
1531531357: Processing 3
1531531357: Processing 4
1531531357: Processing 5
1531531357: Processing 6
1531531357: Processing 7
1531531357: Processing 8
1531531357: Processing 9
1531531357: Processing 10
1531531357: Processing 11
1531531357: Processing 12
1531531357: Processing 13
1531531357: Processing 14
1531531357: Processing 15
1531531357: Processing 16
1531531357: Processing 17
1531531357: Processing 18
1531531357: Processing 19
1531531367: Done

如果一开始使用wait_available(),则返回到与spawn类似的行为。所以,如果您正在使用spawn,则不需要wait_available(),因为它们会进行相同的检查(检查信号量以查看池中是否有空间(。

希望它能有所帮助!Gevent太神奇了!快乐的编码!

相关内容

  • 没有找到相关文章

最新更新