我正在尝试使用并行处理/线程编写一个python类来读取两个串行端口(/ dev / ttyS1和/ dev / ttyS2)。这两个端口都以19200波特率运行并且一直处于活动状态。我为此目的使用了pySerial。
两个读取操作都需要连续并发地运行。我想知道是否应该使用线程库或线程库或多处理库。我只是担心因为全局解释器锁不能为重型IO操作提供真正的线程处理能力。但是如果全局解释器锁不影响我,那么我将使用线程/线程模块。但是,如果确实如此,那么我需要交叉编译python多处理库,因为这是在嵌入式系统上。
所以我的代码通常会有 thread1或process1 =读取ttyS1并在读取行上执行某些字符串操作后写入缓冲区。 thread2或process2 =读取ttyS2并在读取行上执行某些字符串操作后写入另一个缓冲区。 其他功能等 代码中的其他部分进一步利用这些缓冲区。
python中的多处理还需要多个内核/ cpus吗?
感谢阅读!
答案 0 :(得分:1)
我不是以任何方式讨论这个问题的专家,但我一直在发现,如果我可以通过流程进行并行化,那么使用threading
所需的额外细微之处是不值得的。
您在备选方案中未提及的第三个模块是subprocess
。
根据OP的要求编辑:您可以通过为串行接口创建单独的脚本来实现并行处理。这是一个快速演示,它假设两个文件都在同一目录中。
文件com.py
- 串行脚本 - 这只是一个模拟,但这里的想法是脚本自动运行,并且只使用 stdin 和 stdout 与主程序通信。
import sys
counter = 0
while True: # The program never ends... will be killed when master is over.
counter += 1
sys.stdin.readline()
sys.stdout.write('Serial from com1 is %d\n' % counter)
sys.stdout.flush()
档案master.py
- 主程序
from subprocess import Popen, PIPE
from time import sleep
p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
print "serial communication started." # com.py is working but we moved on!
for i in range(3):
p.stdin.write('<command-here>\n')
print "comand sent."
print "received : %s" % p.stdout.readline()
sleep(1)
最后,这是预期输出的转储:
mac@jabbar:~/Desktop$ ./master.py
serial communication started.
comand sent.
received : Serial from com1 is 1
comand sent.
received : Serial from com1 is 2
comand sent.
received : Serial from com1 is 3
HTH!
答案 1 :(得分:1)
GIL在读取操作期间被释放,因此它不会对您产生太大影响。
交叉编译multiprocessing
听起来有点矫枉过正,或者至少是过早优化。
保持代码模块化,以便可以稍后切换。
我相信线程性能取决于您的操作系统。您的里程会有所不同,特别是在嵌入式系统上。
如果你有一个小时的空闲时间,David Beazley有一个talk on the GIL(PDF幻灯片here)。对于高性能线程,你需要看到它以获得关于线程,GIL和操作系统如何协同工作以消除性能的令人讨厌的细节。