5

トークンリングLANのシミュレーションを作成していて、メインプログラムとは別のスレッドでタイマーを実行して、モニターから「アライブステータス」を受信したときのタイムアウトを確認しようとしています。他のノードの前にモニタープログラムを開始しています。どちらも、送信して「アライブステータス」になるまで、または新しいモニターの選択を開始する前に同じ待機時間がありますが、ノードプログラムはモニターの前にタイムアウトしているようです。

これはPythonの同時実行性の問題ですか、それとも私のコードの問題である可能性が高いですか?

これがスレッドが実行する関数です。詳細が必要な場合は、質問してください。

def timer():
    global reset
    global ismonitor
    global mToSend
    global dataToSend
    reset = time.time()
    send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while 1:
        timer = time.time()
        elapsed = timer - reset
        if elapsed > 5:
            if ismonitor:
                mToSend = "110000" ## send around a token with a monitor alive flag on the broadcast channel
                mToSend += maddr
                dataToSend = True
                reset = time.time()
            else:
                holdelection()
                reset = time.time()
4

1 に答える 1

2

Pythonのグローバルインタープリターロック(GIL)により、スレッドが同時に実行されることはありません。代わりに、他のすべてのスレッドがロックされている間(コードを実行していない間)、1つのスレッドが実行時間のスライスを取得します。そのため、time.time()の呼び出しは、スレッドに割り当てられた最小のタイムスライスと同じくらい正確です。

Pythonでスレッドがどのように機能するかをよりよく理解するためにDavidBeazleyの仕事を見てください:http ://www.dabeaz.com/GIL/彼は、Pythonのバージョンによっては、使用するスレッドが数秒間ブロックされる可能性があることを示しています彼らはGILを再取得することができます。その場合、time.time()呼び出しは同じ時間だけオフになります。

より高い精度が必要な場合は、スレッドの代わりにプロセスの使用を検討する必要があります。マルチプロセッシングモジュールの助けを借りて、Pythonのスレッドよりも使用が複雑ではありません:http://docs.python.org/3.3/library/multiprocessing.html

于 2013-03-26T11:07:17.700 に答える