2012-12-07 19 views
3

是的其他人之前已經問過這個問題,但不是在同一個上下文中或我的滿意。所以,這裏去::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錯誤?

回答

7

不一定是一個真正的答案,但我不會使用multiprocessing來並行訪問套接字,如連接到X服務器。這看起來不是一個好主意。改用普通的線程。

請注意,multiprocessing是一個基於hack的(有時)分叉,所以當父和子都嘗試訪問它時,分叉套接字究竟發生了什麼......是隨機混合垃圾。

編輯:原因是這兩個分叉的套接字仍然是套接字的「同一端」,X服務器在「另一端」持有。當X服務器想要發送消息時,它會在套接字上寫入100個字節。但如果你不走運,分叉進程1讀取前50個字節,分叉進程2讀取剩餘的50個字節。每個進程意外地只獲取消息的隨機部分。他們每個人都會抱怨X服務器正在發送廢話。

+0

+1。許多開發人員並沒有意識到X11是建立在套接字之上的,所以即使他們不知道直接在fork的兩側使用套接字,他們也希望能夠在雙方使用相同的X連接。 (也就是說,最流行的非套接字GUI也不能用於'multiprocessing',出於不同的原因 - Mac上的分叉進程沒有CoreFoundation,沒有'fork',因此沒有像GDI那樣共享每個進程資源Windows ...) – abarnert

+0

1. Python線程不完全併發,這就是我使用多處理的原因。 2.我正在考慮按照線程(或進程)隔離效果並打開通道(套接字或其他方式)。在這裏,我不知道哪些通道會導致問題孤立效應。我希望沿着這個方向發出一些光。 另外,請你詳細說明爲什麼直接在叉子的兩側使用插座是一個壞主意 – knk

+0

編輯我的答案。爲了解決你的問題,你應該確保任何'multiprocessing'的使用僅限於程序的非GUI部分。換句話說,當您想要執行計算密集型任務時可以使用'multiprocessing',但是您只能使用'multiprocessing'模塊中提供的API在各個部分之間進行通信。任何對pygame的調用都必須在主進程中完成。 –

相關問題