2011-11-24 28 views
6

2つのシリアルポート(/ dev/ttyS1と/ dev/ttyS2)を読み込むための並列処理/スレッドを利用して、Pythonクラスを作成しようとしています。これらのポートは両方とも19200ボーレートで動作し、常にアクティブです。私はこの目的のためにpySerialを使いました。シリアルポートを読むためのPython複数スレッド/複数のプロセス

両方の読み取り操作を連続して同時に実行する必要があります。私は、スレッドライブラリまたはスレッドライブラリまたはマルチプロセッシングライブラリを使用すべきかどうか疑問に思っています。私は大量のIO操作のための真のスレッド機能を持たないグローバルインタプリタロックのためにしか心配していません。しかし、グローバルインタプリタロックが私に影響を与えないなら、私はスレッド/スレッドモジュールを使用します。しかし、そうするなら、私は組み込みシステム上にあるので、Pythonマルチプロセッシングライブラリをコンパイルする必要があります。

私のコードでは、通常、 thread1またはprocess1 = ttyS1を読み込み、読み込み行にいくつかの文字列操作を実行した後にバッファに書き込みます。 thread2またはprocess2 = ttyS2を読み取って、読み取り行で文字列操作を実行した後に別のバッファに書き込みます。 その他の機能 これらのバッファは、コード内の他の部分によってさらに利用されます。

また、Pythonでのマルチプロセッシングには複数のコア/ cpusが必要ですか?

読んでいただきありがとうございます!

答えて

1

GILは読み取り操作中に解放されるため、多くの影響を与えるべきではありません。 クロスコンパイルmultiprocessingは、過剰殺戮、または少なくとも時期尚早最適化のようなサウンドです。 に後で切り替えることができるように、コードモジュラーを維持してください。

スレッドのパフォーマンスはお使いのOSによって異なると思います。あなたの走行距離は、特に組み込みシステムによって異なります。

時間があれば、David Beazleyのtalk on the GILがあります(PDFスライドhere)。高性能なスレッド化のためには、スレッディング、GIL、OSがどのように連携してパフォーマンスを低下させるかという厄介な詳細を知ることが望ましいでしょう。

+0

GILのリリースについての情報をありがとう。組み込みシステムの使用は、arm5telアーキテクチャの550MHz CPU上で行われます。私は病気がちょうど異なるセットアップでいくつかのベンチマークをして、どれくらい私がそれから出ることができるかを見なければならないと思う。また、ビデオのおかげでそれを見てくれてありがとう! – kal

1

私はどのような方法でもエキスパートではありませんが、threadingが必要とする追加の微妙な量は、プロセスを介して並列化できる場合、努力する価値がないことがわかります。

代替案の中で言及しなかった第3のモジュールは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

関連する問題