我使用的是线程模块,有3个不同的函数,它们返回相同的值,但使用不同的方法返回该值。
我想要和ID,并将其称为my_ID
例如:
功能#1:使用移动端点抓取网站,并解析my_id 的json
函数#2:使用桌面端点抓取网站,并为my_id 解析json
功能#3:抓取桌面网站HTML并查找my_id
我想做的是同时运行每个函数,无论哪个函数返回my_id最快,我都会接受它并继续我的代码。
对此,最好的方法是什么?
您可以使用concurrent.futures.
创建三个线程并使用concurrent.futures.Executor.submit()
启动它们这将为您返回每个线程的未来对象。
然后你可以
concurrent.futures.wait(fs, timeout=None, return_when=FIRST_COMPLETED)
这将阻塞主线程直到3个子线程中的一个子线程完成。
然后你可以继续使用你的结果。
concurrent.futures.wait Returns a named 2-tuple of sets. The first set, named done and not_done
您可以使用result((方法从已完成的期货对象中获得结果,也可以使用executor.shutdown((安全地关闭执行程序
您可以将对象添加到列表中,然后按如下方式启动它们:
futures = []
for task in task_list:
futures.append(executor.submit(task.run))
concurrent.futures.wait(futures,timeout=None,return_when=FIRST_COMPLETED)