如何不等待线程在 Python 中完成

How NOT to wait for a thread to finish in Python

在这个中,他居然问了我想要的东西。除了答案是删除括号。但是,如果我删除括号,那么我将无法为我的函数传递参数。

如何在不等待的情况下执行以下简单代码:

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever(i))
  t.start()

期望的输出是

Hey! It's me number 0
Hey! It's me number 1
Hey! It's me number 2

全部同时打印

From the documentationtarget 应该是可调用的:

target is the callable object to be invoked by the run() method

您没有将函数传递给 target,您传递的是函数的 return 值,因此函数在传递给 threading.Thread 后立即运行,而不是当你打电话给 t.start().

您应该使用 args 参数来为您的可调用对象指定参数。

只需更改此行:

 t = threading.Thread(target=whatever(i))

t = threading.Thread(target=whatever, args=(i,))
from time import sleep
import threading

def whatever(i):
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever, args=(i,))
  t.start()

不过你必须考虑一件事。

在 Python 中,我们有一个叫做 GIL - 全局解释器锁的东西。简而言之,它可以让 python 应用程序的一个线程同时在给定的解释器中执行。这是什么意思?

在 Python 中实现真正的并发并不是那么容易 - 虽然由于我们今天拥有超快的 CPU,指令似乎是同时执行的,但实际上并非如此.

你似乎没有意识到这一行的作用:t = threading.Thread(target=whatever(i)),删除括号不仅仅是为了不等待线程完成它所以你实际上可以 start 单独线程中的函数:

target 应该是函数对象本身,但是当你执行 t = threading.Thread(target=whatever(1)) 时,target 将是你 whatever 的 return 值已经 运行 在您的原始线程中,您需要给函数本身 threading 然后单独指定参数,它会像这样为您调用它:

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever, args=(i,))
  t.start()

只需将其包装成 lambda。

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=lambda: whatever(i))
  t.start()