同时运行多个线程

3

因此,我的目标是让do_something()函数启动自己的线程,以便do_something()可以并行运行,而不必等待前一个线程完成。问题在于它似乎不是多线程(意味着一个线程在另一个线程开始之前就已经完成)。

for i in range(len(array_of_letters)):

    if i == "a":
        t = threading.Thread(target=do_something())

        print "new thread started : %s"%(str(threading.current_thread().ident))     
        t.start()

do_something()函数中,我也有一个current_thread().ident,但似乎启动的线程的标识与运行Python脚本的主线程相同。我认为我的方法是不正确的。


@Jean-François Fabre 是正确的,我相信,关于立即问题。即使这样修复了,你应该知道,在Python中,线程并不真正同时运行,因为在大多数情况下,Python解释器无法同时解释两个或更多不同的执行线程(并有一些称为全局解释器锁(GIL)的东西来防止它)。相反,发生的情况是它运行一个线程直到它被阻塞等待共享资源、进行I/O或调用sleep(),然后仅在这种情况下才切换到运行另一个(如果有的话),该线程正在等待轮到它。 - martineau
1个回答

3

这是一个常见且容易犯错的错误。

target=do_something() 会立即在主线程中执行您的函数并将 None(我想是您的函数的返回值)作为 target 函数传递给线程,这不会触发任何可见的错误;但也什么都不做。

您必须传递实际的函数而不是结果:

t = threading.Thread(target=do_something)

将会有更好的效果


是的,恶魔标记对 ()[] 中的一对又起作用了 - 在我看来这是一个很好的解释。 - Dilettant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接