Python:如果不启动线程就无法创建线程

时间:2018-08-21 17:00:43

标签: python python-3.x multithreading

我正在尝试制作一个可以通过线程同时下载多个图像的python程序。但是,问题是我必须询问用户他/她要下载多少个图像,因此我必须使用循环为每次下载创建一个新线程。

我尝试过,结果证明我也无法启动线程而无法创建线程。我希望循环创建的两个线程都大致同时启动。但是,循环仅在循环中构造的线程执行完后才能继续进行-因此,我无法同时下载图像。

childWindow->setParent(this)

在循环中是否包含t.start()似乎无关紧要,因为该线程由于该行而自动启动-

QQuickItem

我希望第一个线程开始,并且循环与下一个线程重复,以便两个下载可以同时运行。目前,仅当第一个线程完成时,循环才移至下一个迭代。

4 个答案:

答案 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()方法来显式启动它。但是,您的用例需要注意两点

  • 每个文件添加一个线程进行下载不会提高性能。大约10个线程的数量将是一件好事,因为更多的东西您的收益递减,并且在某个点之后性能实际上可能会下降。
  • 对于您的用例,使用线程池会更容易和更好。

例如

with futures.ThreadPoolExecutor(workers=10) as executor:
    result = executor.map(download_function, list_of_files)