首页 > 解决方案 > 线程输出未按预期进行

问题描述

对于给定的线程示例,为什么在空闲和在线编辑器上的输出不同。请帮助了解导致此问题的实际问题?

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  

标签: pythonpython-3.xpython-multithreading

解决方案


如果在获取结果时线程启动的顺序很重要,那么管理它的一种方法是将递增的 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()

推荐阅读