Python多处理超时

时间:2016-01-13 20:10:30

标签: python multiprocessing

我有一个程序不断从数据库获取数据,然后处理数据,然后通过FTP将其上传到服务器。它看起来像:

feed = connect2database()
for data in feed.changes():
    data = process(data)
    ftpUpload(data)

这里的问题是ftp上传可能会永远挂起,这会导致程序挂起。我想实现一种在子进程中进行上传的方法,为每个进程设置超时,如果有任何超时,只需将其删除即可。我不需要从子进程中获取任何数据,也不需要在上传失败时重试。

但我不想做.join(time),因为主要过程必须停在那里等待。我只是希望主进程不断获取数据,然后fork子进程进行上传,它超过了超时,只需杀死它以避免僵尸。就这样。任何人都可以建议一个架构吗?感谢。

2 个答案:

答案 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问题/答案所在的地方。