2024-03-28 14:25:15 发布
网友
所以我有一个函数,比如test和gevent池,大小为10。在
pool.Pool(size=10) def test(): pool.wait_available(timeout=0.5) pool.spawn(something)
如果函数测试是由不同的线程调用的,它会引起任何问题吗。我的意思是wait_available应该是线程安全的,但是{}会有线程安全/竞争条件问题。我的意思是,假设已经有9个greenlet在运行,并且有几个请求调用测试函数。他们两个都会读pool.wait帴它不应该阻挡池.繁殖就在那之后,他们中的一个会被挡住。在
wait_available
我只想确保pool.spawn的阻塞时间不会超过指定的超时时间。我怎样才能做到这一点?在
pool.spawn
如果您使用的是spawn,那么wait_available是不必要的,因为spawn将在Pool的内部信号量中请求一个lock,该信号量用于跟踪正在运行的greenlet。只有当您使用apply_async时,才有例外。我将在这里解释两种情况:
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个空间:
相反,如果使用apply_Async而不是spawn,它将强制所有调用同时运行。这里会有一个竞态条件,让所有的格林人立即开始执行。在
apply_Async
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(),因为它们会进行相同的检查(检查信号量以查看池中是否有空间)。在
wait_available()
希望有帮助!Gevent太棒了!编码快乐!在
如果您使用的是
spawn
,那么wait_available
是不必要的,因为spawn
将在Pool
的内部信号量中请求一个lock
,该信号量用于跟踪正在运行的greenlet。只有当您使用apply_async
时,才有例外。我将在这里解释两种情况:其输出显示它将以10为一组生成greenlets,因为池中包含10个空间:
^{pr2}$相反,如果使用
apply_Async
而不是spawn,它将强制所有调用同时运行。这里会有一个竞态条件,让所有的格林人立即开始执行。在如果在开始时使用
wait_available()
,则返回到与spawn
相似的行为。所以,如果您使用spawn,您不需要wait_available()
,因为它们会进行相同的检查(检查信号量以查看池中是否有空间)。在希望有帮助!Gevent太棒了!编码快乐!在
相关问题 更多 >
编程相关推荐