如何在后台连续运行python进程

时间:2017-12-11 18:59:38

标签: python multithreading python-3.x asynchronous daemon

我试图在python中构建一个todo管理器,我想继续在bg中运行一个进程,该进程将在指定的时间到来时用弹出窗口提醒用户。我想知道如何实现这一目标。 我已经查看了StackOverflow和其他网站上的一些答案,但没有一个真正有用。 所以,我想要实现的是在用户输入任务后开始一个bg进程并继续在后台运行它,直到时机成熟。同时,可能还有其他线程正在运行以执行其他任务,这些线程将在其结束时间结束。

到目前为止,我已经尝试过这个:

t = Thread(target=bg_runner, kwargs={'task': task, 'lock_file': lock_file_path})
t.setName("Get Done " + task.
t.start()
t.join()

有了这个,线程就会继续运行,但它在前台运行,只在执行完毕后退出。

如果我在上面的代码中添加t.daemon = True,主线程会在start()之后立即退出,看起来守护程序也会被杀死。

请让我知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

您需要做的第一件事是通过在主线程中添加while循环来阻止您的脚本退出:

import time
from threading import Thread

t = Thread(target=bg_runner, kwargs={'task': task, 'lock_file': lock_file_path})
t.setName("Get Done " + task)
t.start()
t.join()
while True:
    time.sleep(1.0)

然后你需要把它放在后台:

$ nohup python alert_popup.py >> /dev/null 2>&1 &

您可以在此answer获取有关控制后台流程的更多信息。

答案 1 :(得分:0)

我猜你在启动脚本后不想看到终端窗口。在这种情况下,这是一个如何执行脚本的问题。

尝试这些事情。

如果您使用的是Windows计算机,可以尝试使用pythonw.exe:

pythonw.exe example_script.py

如果你使用的是linux(也许是OSx),你可能想要使用' nohup'在终端。

nohup python example_script.py

或多或少,您必须这样做的原因归结为操作系统如何处理进程。我不是这个主题的专家,但通常如果您从终端启动脚本,该脚本将成为终端的子进程。因此,如果退出该终端,它也将终止所有子进程。解决这个问题的唯一方法是使用类似nohup的方法从终端分离进程。

现在,如果您最终添加了#!/usr/bin/env python shebang行,那么只要双击脚本,您的操作系统就可以在没有终端窗口的情况下运行脚本。 YMMV(再次取决于您的操作系统的工作方式)