是的其他人之前已經問過這個問題,但不是在同一個上下文中或我的滿意。所以,這裏去::XIO:235個請求(235個已知處理),剩餘0個事件後,X服務器上的致命IO錯誤11(資源暫時不可用):「0」
我正在寫一個應用程序使用python,該程序使用pygame(ergo opengl)來顯示圖形。圖形是在程序本身生成的(所以沒有任何目錄問題)。
應用程序還需要從用戶並行訪問輸入。爲了達到這個目的,我使用一個帶管道的多處理塊,並使用pygame事件循環讀取輸入鍵。下面的代碼在循環中運行。第一次循環迭代工作正常,但在第二次迭代時,我發現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錯誤?
+1。許多開發人員並沒有意識到X11是建立在套接字之上的,所以即使他們不知道直接在fork的兩側使用套接字,他們也希望能夠在雙方使用相同的X連接。 (也就是說,最流行的非套接字GUI也不能用於'multiprocessing',出於不同的原因 - Mac上的分叉進程沒有CoreFoundation,沒有'fork',因此沒有像GDI那樣共享每個進程資源Windows ...) – abarnert
1. Python線程不完全併發,這就是我使用多處理的原因。 2.我正在考慮按照線程(或進程)隔離效果並打開通道(套接字或其他方式)。在這裏,我不知道哪些通道會導致問題孤立效應。我希望沿着這個方向發出一些光。 另外,請你詳細說明爲什麼直接在叉子的兩側使用插座是一個壞主意 – knk
編輯我的答案。爲了解決你的問題,你應該確保任何'multiprocessing'的使用僅限於程序的非GUI部分。換句話說,當您想要執行計算密集型任務時可以使用'multiprocessing',但是您只能使用'multiprocessing'模塊中提供的API在各個部分之間進行通信。任何對pygame的調用都必須在主進程中完成。 –