Python 如何使用具有while循环的守护进程?

Python 如何使用具有while循环的守护进程?,python,Python,我是一个新的守护程序,我想知道如何才能使我的主脚本成为一个守护程序 我有我的主脚本,我希望它成为一个守护进程并在后台运行: main.py def requestData(information): return currently_crunched_data() while True: crunchData() 我希望能够在循环运行时使用requestData函数来处理这个守护进程。我不太熟悉守护进程,也不太熟悉如何将脚本转换成

我是一个新的守护程序,我想知道如何才能使我的主脚本成为一个守护程序

我有我的主脚本,我希望它成为一个守护进程并在后台运行:

 main.py

     def requestData(information):
         return currently_crunched_data()

     while True:
          crunchData()
我希望能够在循环运行时使用requestData函数来处理这个守护进程。我不太熟悉守护进程,也不太熟悉如何将脚本转换成守护进程

但是,我猜我必须创建两个线程,一个用于cruncData循环,另一个用于守护进程请求接收器,因为守护进程有自己的循环(Daemon.requestLoop())


我目前正在研究Pyro来做这件事。有人知道我如何最终使后台运行,而循环能够接收来自其他进程(我想是守护进程)的请求吗

关于在Python中创建守护进程,已经有很多问题,比如,很好地回答了这一部分

那么,如何让守护进程进行后台工作呢

正如您所怀疑的,线程是一个显而易见的答案。但有三种可能的复杂性


首先是关机。如果幸运的话,您的
crunchData
函数可以在没有损坏数据或(太重要)丢失工作的情况下随时被立即终止。在这种情况下:

def worker():
    while True:
        crunchData()

# ... somewhere in the daemon startup code ...
t = threading.Thread(target=worker)
t.daemon = True
t.start()
请注意
t.daemon
。A与作为守护进程的程序无关;这意味着您可以退出主进程,它将被立即终止

但是如果
crunchData
不能被杀死呢?然后,您需要执行以下操作:

quitflag = False
quitlock = threading.Lock()

def worker():
    while True:
        with quitlock:
            if quitflag:
                return
        crunchData()

# ... somewhere in the daemon startup code ...
t = threading.Thread(target=worker)
t.start()

# ... somewhere in the daemon shutdown code ...
with quitlock:
    quitflag = True
t.join()
我假设
crunchData
的每次迭代都不会花那么长时间。如果是,您可能需要在函数本身内定期检查
quitFlag


同时,您希望请求处理程序访问后台线程正在生成的一些数据。您还需要某种同步

显然,只需使用另一个
。但是,
crunchData
很有可能频繁地写入数据。如果每次保持锁10秒,请求处理程序可能会阻塞10秒。但是如果它抓取并释放锁一百万次,这可能需要比实际工作更长的时间

另一种方法是双重缓冲数据:让
crunchData
写入一个新副本,然后,在写入完成后,短暂地抓住锁并设置
currentData=newData

根据您的用例,
队列
、文件或其他东西可能更简单



最后,
crunchData
大概在做大量的CPU工作。您需要确保请求处理程序所做的CPU工作非常少,否则,当两个线程争夺GIL时,每个请求都会大大降低速度。通常这是没有问题的。如果是,请使用
多处理.Process
而不是
线程
(这使得在两个进程之间共享或传递数据稍微复杂一些,但仍然不太糟糕)。

我建议使用supervisord-它避免了处理守护程序问题的需要。这里有两个独立的问题。首先,有一个“我如何一次做两件事”,是的,使用背景线程是一个显而易见的方法,而且会起作用。然后是“如何用Python编写守护进程”,这是一个dup。所以,我将忽略第二个。很抱歉,我已经知道如何用Python编写守护程序:问题是守护程序本身是一个while循环,而我的进程是一个while循环。是的,我正在使用Linux,但希望有一个通用的solution@KingofGames:很好,那么我忽略了正确的部分,回答了(我希望)正确的部分。:)