【问题标题】:Threading behavior is weird in python subprocesspython子进程中的线程行为很奇怪
【发布时间】:2014-07-17 15:53:34
【问题描述】:

所以我基本上有一个这样的案例,在我的主脚本中我有

command = 'blender -b ' + settings.BLENDER_ROOT + 'uploadedFileCheck.blend -P ' + settings.BLENDER_ROOT + 'uploadedFileCheck.py -noaudio'
process = Popen(command.split(' ') ,stdout=PIPE, stderr=PIPE)
out, err = process.communicate()

在子进程脚本 uploadedFileCheck.py 我有一行

exportFile(fileIn, fileOut)
Thread(target=myfunction).start()

所以我希望子进程在 exportFile() 调用之后完成,或者至少返回到 out,错误,但它似乎也在等待线程完成。有人理解这种行为吗?

另外,如果您想知道,我将另一个 python 文件称为子进程,因为主脚本在 python2 中,而脚本(blender)在 python3 中,但这无关紧要(并且无法更改)

【问题讨论】:

    标签: python multithreading subprocess


    【解决方案1】:

    一个进程在其所有非守护线程都退出之前不会退出。默认情况下,Python 中的 Thread 对象被创建为非守护线程。如果您希望脚本在主线程完成后立即退出,而不是等待生成的线程完成,请在启动之前将Thread 对象上的daemon 标志设置为True:

    t = Thread(target=myfunction)
    t.daemon = True
    t.start()
    

    请注意,这将以一种不优雅的方式杀死守护线程,而不会进行任何清理。如果您在该线程中执行任何需要清理的工作,则应考虑一种方法,即您向线程发出信号以使其自行关闭。

    【讨论】:

    • 显然 OP 想要与您推荐的相反:it seems it's waiting for the Thread to finish,至少这是我从问题中理解的......
    • @jadkik94 嗯,我认为这意味着他希望它不等待 Thread 完成...我想我们会让 OP 澄清然后从那里出发。
    • @dano 你说得对!我不想在子进程退出之前等待线程完成。尽管这似乎导致了它自己的问题。在这种情况下,当子进程在线程完成之前退出时,子进程中的资源(线程可能使用的资源)会发生什么?
    • @user1561753 线程的生命周期不能超过它在其中运行的进程的生命周期。所以当uploadedFileCheck.py 退出时,运行myFunction 的线程也会立即结束。您是否希望myFunction 内部发生的操作在uploadedFileCheck.py 的生命周期之外继续运行?如果是这样,您不能为此使用线程。您必须使用 subprocess.Popen 来启动 myFunction 正在执行的任何操作作为单独的脚本。
    • 谢谢!这几乎回答了我需要知道的一切
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2018-09-30
    • 2014-04-15
    • 2013-03-15
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多