2013-08-26 55 views
2

我在python中創建了一個簡單的多人遊戲。我已經使用python中的默認線程模塊拆分了這些進程。但是我注意到,該程序仍然以其他線程的速度減慢。我嘗試使用多處理模塊,但並不是所有的對象都可以被酸洗。Python 2.7.5 - 同時運行多個線程而不減速

是否有替代方案使用多處理模塊來運行同時進程?

回答

0

你需要分析爲什麼你的程序在其他線程工作時放慢速度。假設這些線程正在進行CPU密集型工作,這種減速與由全局解釋器鎖序列化的線程一致。

如果不知道更多關於線程正在執行的工作的性質以及必須並行共享的對象的性質,則無法在詳述中回答。一般來說,您有兩個可行的選項:

  1. 使用進程,通常通過多進程模塊。對象不可揀取的典型原因是因爲它們包含不可取消的狀態,如關閉,打開文件句柄或其他系統資源。但pickle允許對象使用類似於__getstate____reduce__的方法來識別對象的狀態,使用狀態來重建對象。如果你的對象是不可取的,因爲它們很大,那麼你可能需要編寫一個C擴展,將它們存儲在共享內存或內存映射文件中,並且只醃製一個在共享內存中標識它們的鍵。

  2. 使用線程,尋找解決GIL問題的方法。如果您的計算集中在多個熱點,您可以將這些熱點移動到C,並在計算期間釋放GIL。爲此,計算不得引用任何Python對象,即必須在持有GIL時從對象中提取所有數據,並在重新獲取GIL後將其存儲回Python世界。