【python】python为何多线程无法切换

时间:2022-03-01 09:13:14

写了一个kafka传输消息,celery发布任务的脚本。

有四个线程,分别读取不同的kafka队列信息

问题是,只有第一个线程会启动,剩下的三个线程连start都运行不了。

 

而且这个问题不是一开始就发生的,最开始跑代码的时候很正常。连续运行了半个月都没问题。就是后来重启后就有问题了。

后来发现,在每个线程里面加sleep后,线程会切换了。但切换极慢,无法忍受。而且正常的threading根本不需要sleep就可以切换线程的。

 

这期间的变化只有升级了celery相关的rabbitmq服务,但这个应该跟python多线程没什么关系吧。

 

啊啊啊啊啊啊啊啊啊,要疯

-------------------------------------------------------------------------------------

更新: 问题原因找到了 多线程与gevent不能同时使用.......

 

为了使用gevent的协程功能,需要monkey.patch_all()   但该函数会改变python底层的一些处理导致多线程无法使用

 

具体场景:

我的脚本a.py是多线程的,在开始时引用了b.py,而b.py在全局设置了monkey.patch_all()。

 

解决方法:

不要在b.py的全局设置monkey.patch_all(), 而是到具体需要使用gevent的函数中再设置。这样a.py引用b.py时就不会引用到monkey.patch_all()的设置了。