我有一个程序,可以打开很多网址并下载图片。
我有一个程序的功能,它管理链接的打开和图片下载,其中包含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()函数。 哪种方法最好与包含大量模块的程序一起使用,并执行大量的
答案 0 :(得分:1)
asyncio模块非常适合此任务。
您可以创建未来,然后使用支持超时参数的asyncio.wait
。
答案 1 :(得分:1)
在这里使用multiprocessing
会有点棘手,因为fun
正在消耗一个优先级队列(我假设Queue.PriorityQueue
)来自其他部分该程序。 queue
无法在进程之间轻松传递 - 您需要创建自定义multiprocessing.BaseManager
subclass,向其注册Queue.PriorityQueue
类,然后启动Manager
服务器,实例化服务器上PriorityQueue
,并在与队列交互的任何位置使用Proxy
到该实例。这需要很多开销,并且还会损害性能。
因为看起来你实际上并不想要任何并发 - 你希望程序的其余部分在fun
运行时停止 - 我不认为这是一个令人信服的理由使用multiprocessing
。相反,我认为使用基于time
的解决方案更有意义。