Python 多线程:如何 运行 循环中的多个异步线程
Python multithreading: How to run multiple async threads in a loop
让我们想象一下下面的代码:
import threading
from time import sleep
def short_task():
sleep(5)
print("short task")
def long_task():
sleep(15)
print("long task")
while True:
st = threading.Thread(target=short_task())
lt = threading.Thread(target=long_task())
st.start()
lt.start()
st.join()
lt.join()
我有两个函数,每个函数都需要不同的时间来处理,在我上面的方法中,输出将如下所示:
short task
long task
short task
long task
short task
long task
short task
long task
但所需的输出是:
short task
short task
short task
long task
short task
short task
short task
long task
实现此目标的最佳方法是什么?一种可能肮脏的方法是删除主 while
循环并在每个线程中放置一个 while
循环。
正如您在问题中假设的那样,将 while 循环移动到线程内部将有助于获得预期的结果。
还有一件事。您在传递目标时调用该函数。您只需要单独传递函数名称。例如:target=short_task
也在你的主 while 循环中,因为你正在等待线程完成,因此输出交替出现是有意义的。我认为这是一个逻辑错误。
尝试下面的代码应该能达到您的预期。
我已将 short 函数的等待时间从 5 改为 4。以确保维持您想要的顺序。
import threading
from time import sleep
def short_task():
while True:
sleep(4)
print("short task")
def long_task():
while True:
sleep(15)
print("long task")
st = threading.Thread(target=short_task)
lt = threading.Thread(target=long_task)
st.start()
lt.start()
st.join()
lt.join()
让我们想象一下下面的代码:
import threading
from time import sleep
def short_task():
sleep(5)
print("short task")
def long_task():
sleep(15)
print("long task")
while True:
st = threading.Thread(target=short_task())
lt = threading.Thread(target=long_task())
st.start()
lt.start()
st.join()
lt.join()
我有两个函数,每个函数都需要不同的时间来处理,在我上面的方法中,输出将如下所示:
short task
long task
short task
long task
short task
long task
short task
long task
但所需的输出是:
short task
short task
short task
long task
short task
short task
short task
long task
实现此目标的最佳方法是什么?一种可能肮脏的方法是删除主 while
循环并在每个线程中放置一个 while
循环。
正如您在问题中假设的那样,将 while 循环移动到线程内部将有助于获得预期的结果。
还有一件事。您在传递目标时调用该函数。您只需要单独传递函数名称。例如:target=short_task
也在你的主 while 循环中,因为你正在等待线程完成,因此输出交替出现是有意义的。我认为这是一个逻辑错误。
尝试下面的代码应该能达到您的预期。
我已将 short 函数的等待时间从 5 改为 4。以确保维持您想要的顺序。
import threading
from time import sleep
def short_task():
while True:
sleep(4)
print("short task")
def long_task():
while True:
sleep(15)
print("long task")
st = threading.Thread(target=short_task)
lt = threading.Thread(target=long_task)
st.start()
lt.start()
st.join()
lt.join()