我有一个程序不断从数据库获取数据,然后处理数据,然后通过FTP将其上传到服务器。它看起来像:
feed = connect2database()
for data in feed.changes():
data = process(data)
ftpUpload(data)
这里的问题是ftp上传可能会永远挂起,这会导致程序挂起。我想实现一种在子进程中进行上传的方法,为每个进程设置超时,如果有任何超时,只需将其删除即可。我不需要从子进程中获取任何数据,也不需要在上传失败时重试。
但我不想做.join(time)
,因为主要过程必须停在那里等待。我只是希望主进程不断获取数据,然后fork子进程进行上传,它超过了超时,只需杀死它以避免僵尸。就这样。任何人都可以建议一个架构吗?感谢。
答案 0 :(得分:1)
您可以使用Pebble。
from pebble.process import concurrent
TIMEOUT_IN_SECONDS = 5
feed = connect2database()
for data in feed.changes():
data = process(data)
concurrent(target=ftpUpload, args=(data, ), timeout=TIMEOUT_IN_SECONDS)
答案 1 :(得分:1)
用于此类任务的一个好框架是Luigi。它专为数据依赖而设计,但您可以轻松设置每个任务的超时,并且可以设置它以使其不会重试失败的任务。 Here's使用Luigi的原始示例。
要为每项任务设置超时,请将worker-timeout
设置为以秒为单位的时间量。 http://luigi.readthedocs.org/en/stable/configuration.html
要设置luigi以便它不会重试任务,请将disable_failures设置为0. http://luigi.readthedocs.org/en/stable/_modules/luigi/scheduler.html
要了解luigi的工作原理需要花费大量的工作,而且文档比我想要的更稀疏。 Luigi Google Group是许多luigi问题/答案所在的地方。