如何不等待线程在 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 documentation、target
应该是可调用的:
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()
在这个
如何在不等待的情况下执行以下简单代码:
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 documentation、target
应该是可调用的:
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()