python - 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
不会阻塞超过指定的超时期限。我怎样才能做到这一点?
解决方案
wait_available
如果您使用spawn
from则没有必要,pool
因为spawn
会lock
在Pool
s 内部信号量中要求一个用于跟踪正在运行的 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 太棒了!快乐编码!
推荐阅读
- r - 用于按列计算 R 数据帧中位数的函数,该 R 数据帧定期对多个数据帧执行
- mongodb - 如何聚合猫鼬深度收藏?(过滤数据)
- spring-boot - 在 Spring Boot 中调度一个函数
- postgresql - Postgres 中的异常处理。在异常处理程序中使用引发和回滚
- spring - Spring Boot/Thymeleaf 可执行 Jar,错误解析模板
- python - 如何在没有内置函数的情况下使用参数'key'?
- reactjs - React:为什么注册表单没有在 firebase 用户中创建新用户?
- ios - UISearchBar 警告:UITextEffectsWindow 不应成为键。请向键盘提交错误 | 带有此调用堆栈的 iOS
- html - 如何使用 css 创建倾斜的图像和文本?
- java - 如何使用execute_script输入python selenium