python - 线程输出未按预期进行
问题描述
对于给定的线程示例,为什么在空闲和在线编辑器上的输出不同。请帮助了解导致此问题的实际问题?
import threading
from time import sleep, time, ctime
loops = [4, 2]
def loop(nloop, nsec):
print('start loop', nloop, 'at:', ctime(time()))
sleep(nsec)
print('loop', nloop, 'done at:', ctime(time()))
def main():
print('starting threads…')
threads = []
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(target=loop,
args=(i, loops[i]))
threads.append(t)
for i in nloops: # start threads
threads[i].start()
for i in nloops: # wait for all
threads[i].join() # threads to finish)
print('all DONE at:', ctime(time()))
if __name__ == '__main__':
main()
预期产出
starting threads…
start loop 0 at: Fri Sep 17 12:43:26 2021
start loop 1 at: Fri Sep 17 12:43:26 2021
loop 1 done at: Fri Sep 17 12:43:28 2021
loop 0 done at: Fri Sep 17 12:43:30 2021
all DONE at: Fri Sep 17 12:43:30 2021
输出在我的本地机器上空闲
starting threads…
start loopstart loop 01 at:at: Fri Sep 17 18:19:39 2021Fri Sep 17 18:19:39 2021
loop 1 done at: Fri Sep 17 18:19:42 2021
loop 0 done at: Fri Sep 17 18:19:44 2021
all DONE at: Fri Sep 17 18:19:44 2021
解决方案
如果在获取结果时线程启动的顺序很重要,那么管理它的一种方法是将递增的 id 传递给每个线程。每个线程都应该将其结果返回到某个线程安全的位置(例如列表)。然后,当所有线程都终止时,您只需要对以其 id 为键的列表进行排序。这是一个例子: -
from threading import Thread
import random
results = []
def myThread(id):
results.append((id, random.randint(0, 100)))
def main():
threads = []
for id in range(10):
t = Thread(target=myThread, args=(id,))
t.start()
threads.append(t)
for t in threads:
t.join()
print(sorted(results, key=lambda x: x[0]))
if __name__ == '__main__':
main()
推荐阅读
- file - “带有文件名但没有文件扩展名的路径”的正确术语是什么
- javascript - 异步函数后的函数
- python - AWS CDK python 捆绑包,在 requirements.txt 中具有依赖项
- python - 如何从 Discordpy 中的目录发送 GIF
- react-native - 我的基于 Expo 的 React Native 应用程序中未显示图标
- html - 换行到
- python - 使用 python 假设库生成 Pandas 数据框,其中一行依赖于另一行
- python - 在使用训练而不是拟合后创建排列变量重要性
- python - 为 B 中 A 的所有元素设置成员资格
- java - 如何重写程序,使成绩和单位对的数量成为运行时的输入值