python中定时终止一个任务的场景

本文从WordPress迁移而来, 查看全部WordPress迁移文章

在某些场景下,我们可以要执行一个无限循环的任务,或者一个你无法估计它什么时候能结束的任务,而它是否完成做完,对结果是没有太大影响的。

例如我需要下一个大文件,因为某种原因FTP服务器会抽风,下载到一半会停掉或者速度非常慢,但这份数据我并不需要非常严格地全部取回来,但时间我需要控制。假设允许给我的下载是1小时,在1小时后我需要终止这个步骤,去执行下一个流程。另一个场景则是,如果在规定时间内,该任务还没完成,主流程要强制退出了,这个任务也要随之终止。

目前的方法是,把这样的线程放到一个线程中或进程中去完成,然后join,设置超时,如果join返回了线程或进程还活着,则强制将其退出。

对于主流程退出,该任务也跟着退出,线程和进程实现起来都很简单

1
2
3
4
5
6
7
8
9
10
import threading
thread = threading.Thread(target = thread_worker)
thread.setDaemon(True)
thread.start()
thread.join(timeout = xxx)

import multiprocessing
process = multiprocessing.Process(target = process_worker)
process.daemon = True
process.join(timeout = xxx)

在主流程退出后子流程会跟着退出。如果没有daemon的设置,主流程会等待子流程结束为止

但如果只希望终止子流程而不退出主流程,用线程的方法则很麻烦,直接来讲,线程没有提供这样的方法,但进程有

1
2
3
4
import multiprocessing
process = multiprocessing.Process(target = process_worker)
process.join(timeout = xxx)
process.terminate()

使用terminate强行终止子流程