我刚接触守护进程,我想知道如何使我的主脚本成为守护进程?在
我有我的主脚本,我想制作一个守护进程并在后台运行:
main.py
def requestData(information):
return currently_crunched_data()
while True:
crunchData()
我希望能够在循环运行时对这个守护进程使用requestData函数。我不太熟悉守护进程,也不太熟悉如何将脚本转换为守护进程。在
不过,我猜我必须创建两个线程,一个用于cruncData循环,一个用于守护进程请求接收方,因为守护进程有自己的循环(daemon.requestLoop()). 在
我目前正在调查派洛做这件事。有人知道我如何最终使后台运行,而循环能够接收来自其他进程的请求(我想是守护进程)?在
关于在Python中创建守护进程,比如this one,已经有很多问题可以很好地回答这个问题。在
那么,你如何让你的守护进程做后台工作呢?在
正如您所怀疑的,线程是一个显而易见的答案。但有三种可能的复杂性。在
首先,关闭了。如果幸运的话,您的
crunchData
函数可以在没有损坏的数据或(非常重要的)丢失工作的情况下随时被终止。在这种情况下:注意
t.daemon
。一个"daemon thread"与你的程序是一个守护进程无关;它意味着你可以直接退出主进程,它将被立即终止。在但是如果
^{pr2}$crunchData
不能被杀死呢?然后你需要做一些类似的事情:我假设
crunchData
的每次迭代不会花那么长时间。如果是这样,您可能需要在函数本身内定期检查quitFlag
。在同时,您希望您的请求处理程序访问后台线程正在生成的一些数据。你也需要一些同步。在
显而易见的是只使用另一个
Lock
。但是crunchData
很有可能频繁地写入其数据。如果它一次持有锁10秒,请求处理程序可能会阻塞10秒。但是,如果它抓取并释放锁一百万次,这可能需要比实际工作更长的时间。在另一种方法是对数据进行双重缓冲:让
crunchData
写入一个新的副本,然后,在完成后,短暂地获取锁并设置currentData = newData
。在根据您的用例,
Queue
,一个文件或其他东西可能更简单。在最后,
crunchData
大概要做大量的CPU工作。您需要确保请求处理程序只做很少的CPU工作,否则当两个线程争夺GIL时,每一个请求都会减慢速度。通常这没问题。如果是这样,请使用multiprocessing.Process
而不是Thread
(这使得在两个进程之间共享或传递数据稍微复杂一些,但仍然不是太糟糕)。在相关问题 更多 >
编程相关推荐