我认为你不需要仅仅为了计时器而创建第二个进程。
优雅的超时
如果您在退出前需要清理action
过程中,您可以使用Timer
-thread 并让 while 循环检查它是否仍然存在。这允许您的工作进程正常退出,但您将不得不付出性能下降的代价
因为重复的方法调用需要一些时间。不过,如果不是紧密循环,则不一定是问题。
from multiprocessing import Process
from datetime import datetime
from threading import Timer
def action(runtime, x=0):
timer = Timer(runtime, lambda: None) # just returns None on timeout
timer.start()
while timer.is_alive():
if x < 1_000_000_000:
x += 1
else:
x = 0
if __name__ == '__main__':
RUNTIME = 1
p = Process(target=action, args=(RUNTIME,))
p.start()
print(f'{datetime.now()} {p.name} started')
p.join()
print(f'{datetime.now()} {p.name} ended')
示例输出:
2019-02-28 19:18:54.731207 Process-1 started
2019-02-28 19:18:55.738308 Process-1 ended
超时终止
如果您不需要clean关闭(您没有使用共享队列、使用数据库等),您可以让父进程terminate()
在您指定的时间之后工作进程。
终止()
终止该进程。在 Unix 上,这是使用 SIGTERM 信号完成的;在 Windows 上使用 TerminateProcess()。请注意,退出处理程序和finally 子句等将不会被执行。
请注意,该进程的后代进程不会被终止——它们只会成为孤立进程。
警告 如果在关联进程正在使用管道或队列时使用此方法,则管道或队列可能会损坏并且可能无法被其他进程使用。类似地,如果进程已获取锁或信号量等,则终止它可能会导致其他进程死锁。docs https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Process.terminate
如果你在父母那里没有什么可做的,你可以简单地.join(timeout)
工作进程和.terminate()
然后。
from multiprocessing import Process
from datetime import datetime
def action(x=0):
while True:
if x < 1_000_000_000:
x += 1
else:
x = 0
if __name__ == '__main__':
RUNTIME = 1
p = Process(target=action)
p.start()
print(f'{datetime.now()} {p.name} started')
p.join(RUNTIME)
p.terminate()
print(f'{datetime.now()} {p.name} terminated')
示例输出:
2019-02-28 19:22:43.705596 Process-1 started
2019-02-28 19:22:44.709255 Process-1 terminated
如果你想使用terminate()
,但需要您的父母解锁,您也可以使用Timer
- 父级内的线程。
from multiprocessing import Process
from datetime import datetime
from threading import Timer
def action(x=0):
while True:
if x < 1_000_000_000:
x += 1
else:
x = 0
def timeout(process, timeout):
timer = Timer(timeout, process.terminate)
timer.start()
if __name__ == '__main__':
RUNTIME = 1
p = Process(target=action)
p.start()
print(f'{datetime.now()} {p.name} started')
timeout(p, RUNTIME)
p.join()
print(f'{datetime.now()} {p.name} terminated')
示例输出:
2019-02-28 19:23:45.776951 Process-1 started
2019-02-28 19:23:46.778840 Process-1 terminated