首页 > 解决方案 > 如何在_thread中获得输出?

问题描述

我用 Python 创建了一个函数,用于偷猎某些设备、需要快速时间或使用线程的想法。我编写的python代码函数,外围设备响应速度非常快(用wire Shark验证),但现在我需要每个线程都有我启动的函数的输出,以便将它们全部放在输出向量中。如何保存使用此“_thread”库启动的每个线程的输出?

下面是我使用的代码:

import _thread
import time

import atenapy

try:
   tic = time.process_time()
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5A0000005A'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2600000026'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5100000051'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2700000027'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5000000050'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'6000000060'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5200000052'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2D0000002D'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5700000057'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'5F0000005F'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5300000053'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2200000022'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5600000056'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2300000023'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5500000055'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2B0000002B'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.172',9761,'5400000054'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2C0000002C'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'0C0000000C'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2800000028'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'0D0000000D'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2900000029'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'0E0000000E'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.170',9761,'2A0000002A'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'0F0000000F'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1400000014'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1800000018'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1900000019'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1A0000001A'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1B0000001B'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1C0000001C'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1D0000001D'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1E0000001E'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'1F0000001F'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'2000000020'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.164',9761,'2100000021'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.162',9761,'0200000002'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.162',9761,'0300000003'))
   _thread.start_new_thread(atenapy.connect_PE,('192.168.2.162',9761,'0800000008'))
   toc = time.process_time()
   print("all PE time pooling = "+str(toc - tic))
except:
   print ("Error: unable to start thread")

标签: pythonmultithreadingoutputconnection-pooling

解决方案


将您的函数包装在一个工作函数中,该函数收集结果并附加到一个列表中。附加到列表时,锁是可选的(参考:什么样的全局值突变是线程安全的)。

import threading

lock = threading.Lock()
results = []

def func(a,b):
    with lock:
        results.append(a+b)

threads = [threading.Thread(target=func,args=(a,b))
           for a in range(3) for b in range(3)]

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

print(results)

推荐阅读