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

Compare methods to terminate running a function after time period

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

第二个用途也是multiprocessing模块
二解决方案。有人可以建议哪一个更适合在我的程序中使用?我将写一个函数的伪代码:

1
2
3
4
5
6
7
8
9
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()函数。
对于包含大量模块并执行大量操作的程序,哪种方法更好


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

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


asyncio模块非常适合此任务。

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