Python-合并来自多个线程实例的数据
我目前正在从事一个项目,该项目涉及将两个设备连接到python脚本,从中检索数据并输出数据 代码大纲: •扫描配对设备 •找到配对设备创建线程实例(连接的两个设备=两个线程实例) •数据在线程内打印,即每个实例都有一个单独的 数据包 基本上,当两个设备连接在一起时,就会创建我的线程类的两个实例。每个线程实例返回不同的数据包 我的问题是:有没有一种方法可以将两个数据包组合成一个数据包Python-合并来自多个线程实例的数据,python,multithreading,Python,Multithreading,我目前正在从事一个项目,该项目涉及将两个设备连接到python脚本,从中检索数据并输出数据 代码大纲: •扫描配对设备 •找到配对设备创建线程实例(连接的两个设备=两个线程实例) •数据在线程内打印,即每个实例都有一个单独的 数据包 基本上,当两个设备连接在一起时,就会创建我的线程类的两个实例。每个线程实例返回不同的数据包 我的问题是:有没有一种方法可以将两个数据包组合成一个数据包 感谢您的帮助:)我的一般建议是:避免使用这些东西 避免线程 避免使用Python中的多处理模块 避免使用Pyth
感谢您的帮助:)我的一般建议是:避免使用这些东西
- 避免线程
- 避免使用Python中的多处理模块
- 避免使用Python中的futures模块
- 您需要很好地定义输入和输出数据,因为只能传递可序列化的数据
- 你有不同的口译员
- 没有死锁
- 更容易调试
线程化
模块
Python中的线程
Python对于CPU活动不是多线程的。对于大多数操作,解释器仍然使用GIL(全局解释器锁),因此在python脚本中线性化操作。不过,线程化很适合做IO,因为当线程等待IO时,可以唤醒其他线程
主意
由于GIL,我们可以使用标准列表来组合数据。其思想是将相同的列表或字典传递给我们使用args
参数创建的每个线程。看
我们的简单实现使用两个线程来演示如何实现。在现实世界的应用程序中,您可能会使用线程组或类似的东西
实施
进一步思考
如果您希望100%正确并且不依赖GIL来线性化对列表的访问,您可以使用简单的互斥锁来锁定和解锁,或者使用实现正确锁定的
根据数据的性质,字典可能更方便地通过某些键连接数据
其他考虑
应仔细考虑螺纹。
asyncio
等替代方案可能更合适。感谢您提供了代码概述,但我认为MCVCE也会有所帮助。您可以将两个线程的数据放在一个结构中(如列表),但有两个条件:使用相对较小的块进行操作,并用于访问该结构。“进一步思考”的实现这里描述的可以使用队列
(来自队列模块)。它实现了线程安全的必要锁定。这非常有效,谢谢。当我把这个添加到我的代码中时,它合并了来自两个设备的所有数据,但是直到我中断了脚本,它才打印出来。当有新数据要发送时,我应该如何打印数据?您可以有第三个线程使用队列/列表并打印它。根据数据,在线程内打印是否仍然可行?一些python用户正在使用的另一种方法是使用多进程生成一个处理设备的进程和另一个继续读取和计算的进程。请参阅。如何将数据多线程化到数据库中并从中检索?突然之间,输入与输出分离。是的,这假设一个DB能够同时处理多个连接,但这并不罕见。它们中的大多数都是为此而建的。
def worker(data):
# retrieve data from device
data.append(1)
data.append(2)
l = []
# Let's pass our list to the target via args.
a = Thread(target=worker, args=(l,))
b = Thread(target=worker, args=(l,))
# Start our threads
a.start()
b.start()
# Join them and print result
a.join()
b.join()
print(l)