用于读取串行端口的Python多线程/多个进程

时间:2011-11-24 17:06:42

标签: python multithreading concurrency multiprocessing

我正在尝试使用并行处理/线程编写一个python类来读取两个串行端口(/ dev / ttyS1和/ dev / ttyS2)。这两个端口都以19200波特率运行并且一直处于活动状态。我为此目的使用了pySerial。

两个读取操作都需要连续并发地运行。我想知道是否应该使用线程库或线程库或多处理库。我只是担心因为全局解释器锁不能为重型IO操作提供真正的线程处理能力。但是如果全局解释器锁不影响我,那么我将使用线程/线程模块。但是,如果确实如此,那么我需要交叉编译python多处理库,因为这是在嵌入式系统上。

所以我的代码通常会有 thread1或process1 =读取ttyS1并在读取行上执行某些字符串操作后写入缓冲区。 thread2或process2 =读取ttyS2并在读取行上执行某些字符串操作后写入另一个缓冲区。 其他功能等 代码中的其他部分进一步利用这些缓冲区。

python中的多处理还需要多个内核/ cpus吗?

感谢阅读!

2 个答案:

答案 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和操作系统如何协同工作以消除性能的令人讨厌的细节。