首页 > 解决方案 > 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 多没有从连接中获取心跳,所以关闭它。

我试图获取更多日志:

  1. 关于“需要继续”的日志不会注销,在任务期间(不是所有时间,只是任务的一部分时间)每 5 秒。

它显示像,子线程的方法,is_alive()阻塞超过5秒(更重要的是,它必须阻塞超过60秒,这样rabbitmq服务器就会关闭连接)

或者可能是主线程没有正确执行cpu:cpu执行被子线程占用,这是一个cpu密集型任务。占用时间超过60秒?

  1. 我尝试了child process,类似的现象显示。

它也在某些地方阻塞,从日志时间来看,不是每5秒一次。对于使用多进程,我认为它在状态检查方法处被阻塞。

最后,我使用多进程变量来避免使用状态检查方法。现在运行正常。

但是为什么,在执行一些 cpu 密集型任务时线程和进程都会阻塞(并非所有 cpu 密集型任务都显示这一点)?

在我的简单想法中:

多线程不能使用多核,不是说cpu不会从一个线程切换到另一个线程吗?

或者,在多进程中,为什么调用状态检查方法也会阻塞?也无法理解。

谁能告诉我,哪种cpu密集型任务会出现上述现象,为什么?

或者我应该搜索什么关键词才能得到上述原因?

我搜索了关键词:cpu intensive task(中文),因为我没有找到一个非常精确的词,我没有得到任何类似的解释。

我问了我的同事,也没有得到任何答案。

谢谢。

标签: pythonmultithreadingcpuprogress

解决方案


推荐阅读