2011-11-24 59 views
6

我想写一个利用并行处理/线程读取两个串行端口(/ dev/ttyS1和/ dev/ttyS2)的python类。这两个端口都以19200波特率运行,并始终处于活动状态。我为此使用了pySerial。Python多线程/多进程读取串行端口

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

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

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

感谢您的阅读!

回答

1

GIL在读取操作期间被释放,所以它不应该影响你很多。 交叉编译multiprocessing听起来像过度杀伤,或至少过早优化。 尽管如此,请保持代码模块化,以便可以在之间切换。

我确实相信线程的性能取决于您的操作系统。您的里程会有所不同,特别是在嵌入式系统上。

如果您有一个小时的空闲时间,David Beazley的talk on the GIL(PDF幻灯片here)。对于高性能的线程,你会希望看到它获得线程,GIL和操作系统如何共同工作以杀死性能的令人讨厌的细节。

+0

感谢有关GIL发布的信息。不适合使用的嵌入式系统将采用arm5tel架构的550 MHz CPU。我想我只是不得不做一些基准测试,看看我能从中得到多少。也感谢视频生病看看它! – kal

1

我不是这方面的专家,但我一直发现使用threading需要的额外细节的数量是不值得的,如果我可以通过流程并行化。

您没有提到的替代方案中的第三个模块是subprocess

根据OP的要求编辑:您可以通过为串行接口创建单独的脚本来实现并行处理。这是一个快速演示,它假定两个文件都在同一个目录中。

文件com.py - 串行脚本 - 这只是一个模拟的,但这里的想法是,脚本独立经营,并且只使用标准输入标准输出与主控程序进行通信。

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) 

最后,这是预期输出的转储:

[email protected]:~/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!

+0

你能帮我理解子过程对我的场景有何用处?非常感谢你! – kal

+0

@kal - 完成。查看修改。 – mac

+0

非常感谢。这解决了我的麻烦。 – kal