我正在尝试制作一个可以通过线程同时下载多个图像的python程序。但是,问题是我必须询问用户他/她要下载多少个图像,因此我必须使用循环为每次下载创建一个新线程。
我尝试过,结果证明我也无法启动线程而无法创建线程。我希望循环创建的两个线程都大致同时启动。但是,循环仅在循环中构造的线程执行完后才能继续进行-因此,我无法同时下载图像。
childWindow->setParent(this)
在循环中是否包含t.start()似乎无关紧要,因为该线程由于该行而自动启动-
QQuickItem
我希望第一个线程开始,并且循环与下一个线程重复,以便两个下载可以同时运行。目前,仅当第一个线程完成时,循环才移至下一个迭代。
答案 0 :(得分:0)
表格python docs:
类线程.Thread(group = None,target = None,name = None,args =(), kwargs = {},*,daemon = None)
您应按以下方式实例化线程对象:
t = threading.Thread(target=img_down, args=(links[i], names[i]))
否则,您仅调用img_down
方法而不将其传递给Threading对象
答案 1 :(得分:0)
您需要调用.start()
才能启动线程。如果您要等到所有线程完成后,也应该.join()
线程。
例如,
import threading
def foo(*args):
print args
def main():
links = [1,2,3]
names = ['a', 'b', 'b']
_args = zip(links, names)
threadList = [threading.Thread(target=foo, args=arg) for arg in _args]
for thread in threadList:
thread.start()
(2,'b')(3,'b')(1,'a')
这里,我的主线程将在线程仍在运行时退出。为了阻止它在所有线程完成之前执行此操作,请调用join。
for thread in threadList:
thread.start()
thread.join()
答案 2 :(得分:0)
好吧,就像您在documentation中看到的那样,您必须做两件事:
以正确的方式实例化该线程:
t = threading.Thread(target = img_down(links[i], names[i]))
这是阻塞的,因为它是方法调用而不是线程实例化 您必须以这种方式实例化它:
t = threading.Thread(target = img_down, args=(links[i], names[i])
以这种方式启动线程:
t.start()
否则线程将无法正常工作。
通过这种方式,您可以首先实例化所有线程,然后以另一个周期启动它们。
答案 3 :(得分:0)
创建线程不会启动它。您必须通过调用对象.start()
方法来显式启动它。但是,您的用例需要注意两点
例如
with futures.ThreadPoolExecutor(workers=10) as executor:
result = executor.map(download_function, list_of_files)