1 回答

TA貢獻1848條經(jīng)驗 獲得超10個贊
我將嘗試解決主要問題。我對您的實際問題的理解非常有限,因為我不知道您的代碼實際上是做什么的。
“一種在不同線程中使用 pygame 作為多個不同實例的方法,這些實例是從同一進程生成的”
這不起作用,因為 pygame 是基于SDL2構(gòu)建的,SDL2 聲明“您不應(yīng)期望能夠在主線程以外的任何線程上創(chuàng)建窗口、渲染或接收事件”。
“一種安全地同時使用 pygame 的顯示(和更新時鐘)的方法”
與上面相同,顯示僅在主線程中工作。
“一種使用 multiprocessing.Process 的方法,這樣它不需要腌制方法的類,但仍然可以訪問類變量”
您可以使用類似的方法來pickle這些方法dill
,但在進程之間復(fù)制python對象的完整內(nèi)容(對我來說)是錯誤的。我會尋求另一種解決方案。
“一個多處理庫:”
1.要么不需要 pickle lambda 函數(shù),要么能夠
您需要使用序列化 Python 對象才能在進程之間發(fā)送它們。
2.有辦法告訴子進程正在使用哪個進程worker
我不明白這是什么意思。
在我看來,這個問題可以通過更好地分離數(shù)據(jù)和可視化來解決。培訓(xùn)不應(yīng)該了解任何可視化,因為它不依賴于您想要如何顯示它。所以不應(yīng)該有任何理由共享 pygame 顯示。
完成此操作后,執(zhí)行您想要執(zhí)行的操作應(yīng)該不會有太大問題(多線程總是會導(dǎo)致問題)。關(guān)于泡菜問題;我會盡量避免 pickling Python 對象和函數(shù),而只是在線程和進程之間傳遞基本原語??磥砟鷳?yīng)該能夠self.fitnessFromArray
使用簡單的int
方法進行分配,并根據(jù)其值在線程/進程中進行最小/平均/最大計算。
如果你想進行線程化,那么主線程將負(fù)責(zé)渲染。它還會生成用于訓(xùn)練的線程。當(dāng)線程完成時,它們將返回結(jié)果(或?qū)⑵浞湃刖€程安全存儲中),主線程將輪詢數(shù)據(jù)并顯示結(jié)果。如果訓(xùn)練完成的工作花費的時間超過一幀,則劃分工作,以便每個線程僅進行部分訓(xùn)練,并且可以在下一幀停止的地方繼續(xù)。
如果您想要單獨的進程,則原理是相同的。主進程啟動幾個訓(xùn)練進程并通過套接字連接到它們。從套接字中,您可以輪詢有關(guān)程序狀態(tài)的信息并顯示它。它基本上是一個客戶端-服務(wù)器架構(gòu)(盡管在本地主機上),其中訓(xùn)練腳本是服務(wù)器,主進程是客戶端。
添加回答
舉報