python - python关于切换线程的逻辑是什么?
问题描述
这是python运行时cpu密集型任务的现象。我找不到一个词来形容它。而且英语不是我的母语。
我有一个由python编写的程序。它用于保持与rabbitmq服务器的连接,并执行一项cpu密集型任务。
我使用多线程来运行cpu密集型任务。并且想检查线程的状态替换调用方法加入。(原因:我应该通过句柄发送心跳),就像逻辑一样:
while True:
if thread.is_alive(): # status check method
time.sleep(5)
log.debug("need continue")
send_heartbeat()
else:
break
但它会失去rabbitmq的连接。
rabbitmq 记录:60 多没有从连接中获取心跳,所以关闭它。
我试图获取更多日志:
- 关于“需要继续”的日志不会注销,在任务期间(不是所有时间,只是任务的一部分时间)每 5 秒。
它显示像,子线程的方法,is_alive()
阻塞超过5秒(更重要的是,它必须阻塞超过60秒,这样rabbitmq服务器就会关闭连接)
或者可能是主线程没有正确执行cpu:cpu执行被子线程占用,这是一个cpu密集型任务。占用时间超过60秒?
- 我尝试了child process,类似的现象显示。
它也在某些地方阻塞,从日志时间来看,不是每5秒一次。对于使用多进程,我认为它在状态检查方法处被阻塞。
最后,我使用多进程变量来避免使用状态检查方法。现在运行正常。
但是为什么,在执行一些 cpu 密集型任务时线程和进程都会阻塞(并非所有 cpu 密集型任务都显示这一点)?
在我的简单想法中:
多线程不能使用多核,不是说cpu不会从一个线程切换到另一个线程吗?
或者,在多进程中,为什么调用状态检查方法也会阻塞?也无法理解。
谁能告诉我,哪种cpu密集型任务会出现上述现象,为什么?
或者我应该搜索什么关键词才能得到上述原因?
我搜索了关键词:cpu intensive task(中文),因为我没有找到一个非常精确的词,我没有得到任何类似的解释。
我问了我的同事,也没有得到任何答案。
谢谢。
解决方案
推荐阅读
- javascript - Handlebars + puppeteer 使用 base64 显示本地 png 图片
- php - Php FWRITE(到用 FOPEN 创建的文件)和法语字母到 csv 文本文件
- tensorflow - 张量流中softmax函数的反向传播
- java - Swing:JPanel“setSize”被忽略了吗?
- excel - 根据搜索条件查找列名(如果值仅每行唯一)
- azure-logic-apps - 逻辑应用 HTTP 触发器如何同时支持 GET 和 POST 方法?
- python - 在 Python 中从数据框创建值数组,删除不必要的项目
- delphi - 子报表中的重复组
- linux - 大 tar 文件。如何在不解压所有内容的情况下获取根文件夹的 UID GID 属性?
- postgresql - Rails 获得最推荐的产品