首页 > 解决方案 > gevent pool wait_available 线程安全吗

问题描述

所以我有一个函数可以说是大小为 10 的测试和 gevent 池。

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

如果函数测试由不同的线程调用,是否会导致任何问题。我的意思是wait_available应该是线程安全的,但pool.spawn它会有线程安全/竞争条件问题。我的意思是说已经有 9 个 greenlets 正在运行,并且有几个请求调用了测试函数。他们俩都将读取 pool.wait_available ,它不应该阻塞但是之后的 pool.spawn 将使他们中的一个阻塞。

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

标签: pythonpoolgeventgreen-threads

解决方案


wait_available如果您使用spawnfrom则没有必要,pool因为spawnlockPools 内部信号量中要求一个用于跟踪正在运行的 greenlets 的信号量。仅当您使用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而不是 spawn,它将强制所有调用同时运行。这里将有一个竞争条件,所有的 greenlet 都会立即开始执行。

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 太棒了!快乐编码!


推荐阅读