python函数未作为线程运行

2024-09-26 17:43:01 发布

您现在位置:Python中文网/ 问答频道 /正文

这是在Python2.7.12中完成的

serialHelper是python serial周围的一个类模块,该代码运行良好

#!/usr/bin/env python
import threading
from time import sleep
import serialHelper

sh = serialHelper.SerialHelper()

def serialGetter():
    h = 0
    while True:
        h = h + 1
        s_resp = sh.getResponse()
        print ('response ' + s_resp)
        sleep(3)

if __name__ == '__main__':
    try:
        t = threading.Thread(target=sh.serialReader)
        t.setDaemon(True)
        t.start()
        serialGetter()
        #tSR = threading.Thread(target=serialGetter)
        #tSR.setDaemon(True)
        #tSR.start()
    except Exception as e:
        print (e)

然而,尝试以线程的形式运行serialGetter,正如所说的那样,它只是死了。 为什么那个函数不能作为线程运行?你知道吗


Tags: importtruetargetshsleep线程threadresp
1条回答
网友
1楼 · 发布于 2024-09-26 17:43:01

引用the Python documentation

The entire Python program exits when no alive non-daemon threads are left.

因此,如果您setDaemon(True)创建每个新线程,然后退出主线程(通过从脚本末尾掉下来),整个程序将立即退出。这会杀死所有线程。或者不要使用setDaemon(True),或者在没有首先对所有要等待的线程调用^{}之前不要退出主线程。你知道吗


退一步,考虑守护进程线程的预期用例可能会有所帮助。在Unix中,守护进程是在后台运行的进程,通常代表网络上的远程客户机或本地进程为请求提供服务或执行操作。同样的基本思想也适用于守护进程线程:

  1. 使用某种工作队列启动守护进程线程。你知道吗
  2. 当你需要在线程上做一些工作时,你就给它一个工作对象。你知道吗
  3. 当你想要工作的结果时,你可以用一个事件或者一个未来来等待它的完成。你知道吗
  4. 在请求一些工作之后,您总是最终等待它完成,或者取消它(如果您的工作协议支持取消)。你知道吗
  5. 您不必在程序终止时清理守护进程线程。它只是悄悄地消失时,没有其他线程离开。你知道吗

问题是步骤(4)。如果您忘记了某个工作对象,并在不等待其完成的情况下退出应用程序,则工作可能会中断。守护进程线程don't gracefully shut down,因此您可以让外部世界处于不一致的状态(例如,不完整的数据库事务、从未关闭的文件等)。通常最好使用常规线程,并将步骤(5)替换为显式的“完成您的工作并关闭”工作对象,主线程在退出之前将其交给工作线程。然后工作线程识别这个对象,停止等待工作队列,并在不再执行任何其他操作时终止自身。这是一个稍微提前的工作,但是在工作对象被无意中放弃的情况下会更加安全。你知道吗

由于以上所有原因,我建议不要使用守护进程线程,除非您有充分的理由使用它们。你知道吗

相关问题 更多 >

    热门问题