7

はい、他の人が以前にこの質問をしたことがありますが、同じコンテキストではなく、満足のいくものではありません. だから、ここに行きます::

グラフィックを表示するためにpygame(ergo opengl)を使用するプログラムであるpythonを使用してアプリケーションを作成しています。グラフィックはプログラム自体で生成されます (したがって、ディレクトリの問題はまったくありません)。

アプリケーションは、ユーザーからの入力に並列にアクセスする必要もあります。これを実現するために、パイプでマルチプロセッシング ブロックを使用し、pygame イベント ループを使用して入力キーを読み取ります。以下のコードはループで実行されます。最初のループ反復は正常に機能しますが、2 回目の反復で XIO エラーがスローされます。

   parent, child = Pipe(duplex=True)
   # this function draws the canvas
   switches, retOrient = self.drawCanvas(cond, count, dispSize, moves)
   # this function gets the user input in another thread - stage 1
   p = Process(target=userInput, args=(self.button, child) )
   p.start()
   b_press = parent.recv()
   parent.close()

def userInput(button, child):
    button_pressed = button.blockAndWait()
    child.send( "%s"%(button_pressed.keyname) )
    child.close()

このエラーがどのように発生するのか、XIO の内部構造が原因であることに少し当惑しています。このエラーの根本的な原因を実際に説明している他の回答はありません。マルチプロセッシング モジュールは、シングル プロセス アプリケーションとして正常に動作することを考慮して、いくつかの IO チャネル (入力登録オブジェクト、表示オブジェクト、またはイベント ループ) を閉じているか、不要なチャネルをいくつか開いています。この XIO エラーの原因を正確に解読するにはどうすればよいですか?

4

1 に答える 1

10

必ずしも本当の答えではありませんがmultiprocessing、X サーバーへの接続のようなソケットへのアクセスを並列化するためには使用しません。それは悪い考えのように見えます。代わりに通常のスレッドを使用してください。

multiprocessingフォークに基づく (場合によっては) ハックであることに注意してください。そのため、親と子の両方がアクセスしようとしたときに、フォークされたソケットで正確に発生するのは、ランダムに混合されたガベージです。

EDIT:理由は、フォークされた両方のソケットがまだソケットの「同じ端」であり、Xサーバーが「反対側」を保持しているためです。X サーバーがメッセージを送信する場合、ソケットにたとえば 100 バイトを書き込みます。しかし運が悪いと、フォークされたプロセス 1 が最初の 50 バイトを読み取り、フォークされたプロセス 2 が残りの 50 バイトを読み取ります。各プロセスが予期せず、メッセージのランダムな部分しか取得していません。彼らはそれぞれ、X サーバーが無意味なメッセージを送信していると不平を言うでしょう。

于 2012-12-07T01:09:00.857 に答える