【python】python为何多线程无法切换
写了一个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()的设置了。