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

2024-09-20 22:58:23 发布

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

我刚接触守护进程,我想知道如何使我的主脚本成为守护进程?在

我有我的主脚本,我想制作一个守护进程并在后台运行:

 main.py

     def requestData(information):
         return currently_crunched_data()

     while True:
          crunchData()

我希望能够在循环运行时对这个守护进程使用requestData函数。我不太熟悉守护进程,也不太熟悉如何将脚本转换为守护进程。在

不过,我猜我必须创建两个线程,一个用于cruncData循环,一个用于守护进程请求接收方,因为守护进程有自己的循环(daemon.requestLoop()). 在

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


Tags: py脚本truedatareturninformation进程main
1条回答
网友
1楼 · 发布于 2024-09-20 22:58:23

关于在Python中创建守护进程,比如this one,已经有很多问题可以很好地回答这个问题。在

那么,你如何让你的守护进程做后台工作呢?在

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


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

def worker():
    while True:
        crunchData()

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

注意t.daemon。一个"daemon thread"与你的程序是一个守护进程无关;它意味着你可以直接退出主进程,它将被立即终止。在

但是如果crunchData不能被杀死呢?然后你需要做一些类似的事情:

^{pr2}$

我假设crunchData的每次迭代不会花那么长时间。如果是这样,您可能需要在函数本身内定期检查quitFlag。在


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

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

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

根据您的用例,Queue,一个文件或其他东西可能更简单。在


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

相关问题 更多 >

    热门问题