gevent池wait_available线程安全吗

时间:2018-07-14 00:47:33

标签: python pool gevent green-threads

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

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

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

我只想确保pool.spawn的阻塞时间不会超过指定的超时时间。我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果您使用的是wait_available中的spawn,则不需要

pool,因为spawn会在lock中要求Pool的内部信号量,用于跟踪正在运行的greenlet。仅当您使用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个空间,因此将以10个为一组生成greenlets:

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,它将强制所有调用同时运行。在这里,所有的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很棒!编码愉快!