比较在时间段之后终止运行函数的方法

时间:2014-08-22 12:20:31

标签: python python-2.7 time multiprocessing

我有一个程序,可以打开很多网址并下载图片。 我有一个程序的功能,它管理链接的打开和图片下载,其中包含for loop并对优先级队列执行一些操作。我想运行此功能,但不会超过设定的时间段。例如,如果此函数运行时间超过1小时,我想终止它并运行程序的其余部分(其他函数)。 我试图找到一些解决方案,我在堆栈上发现了两个问题。 第一个解决方案仅使用time模块First solution

第二次使用multiprocessing模块 Second solution。有人可以建议哪一个更适合在我的程序中使用?我将写一个函数的伪代码:

def fun():
 for link in linkList:
   if link not in queue:
     queue.push(link)
   else:
     queue.updatePriority(link)
 if queue:
   top = queue.pop()
   fun(top)

在其他函数中调用此函数: def run(startLink):  有趣(STARTLINK)

在其他模块中调用run()函数。 哪种方法最好与包含大量模块的程序一起使用,并执行大量的

2 个答案:

答案 0 :(得分:1)

asyncio模块非常适合此任务。

您可以创建未来,然后使用支持超时参数的asyncio.wait

答案 1 :(得分:1)

在这里使用multiprocessing会有点棘手,因为fun正在消耗一个优先级队列(我假设Queue.PriorityQueue)来自其他部分该程序。 queue无法在进程之间轻松传递 - 您需要创建自定义multiprocessing.BaseManager subclass,向其注册Queue.PriorityQueue类,然后启动Manager服务器,实例化服务器上PriorityQueue,并在与队列交互的任何位置使用Proxy到该实例。这需要很多开销,并且还会损害性能。

因为看起来你实际上并不想要任何并发 - 你希望程序的其余部分在fun运行时停止 - 我不认为这是一个令人信服的理由使用multiprocessing。相反,我认为使用基于time的解决方案更有意义。