第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 python 中使用 Pygame 進行并行處理

在 python 中使用 Pygame 進行并行處理

楊__羊羊 2023-10-25 10:44:15
我正在嘗試訓(xùn)練神經(jīng)網(wǎng)絡(luò)來玩使用 Pygame 制作的 SMB1 游戲。為了提高速度,我想使用并行處理,以便由不同的群體成員(并在不同的訓(xùn)練數(shù)據(jù)上)同時玩游戲的多個副本。我的問題的根源在于 Pygame 本質(zhì)上并不是基于實例的;也就是說,它只會生成一個帶有一個顯示對象的窗口。因為我無法創(chuàng)建多個 Pygame 窗口并為每個進程顯示對象,所以進程必須共享一個顯示對象。這引出了我的第一個問題:有沒有辦法擁有 pygame 的多個實例,如果沒有,是否有一種(性能輕)方法同時在顯示器上繪圖?也就是說,每個游戲都會繪制到整個窗口的不同部分。然而,我并不真的需要渲染每個游戲;我只關(guān)心至少渲染一個游戲?qū)嵗员阄铱梢员O(jiān)控其進度。我的解決方案是為每個游戲分配一個進程 ID,只有進程 ID 為 0 的游戲才會真正繪制到顯示器上。并發(fā)問題解決了!為了實現(xiàn)這一點,我使用了 multiprocessing.Process:processes = [];genome_batches = np.array_split(genomes,self.runConfig.parallel_processes);for i in range(runConfig.parallel_processes):    process = multiprocessing.Process(target=self.eval_genome_batch_feedforward,args=(genome_batches[i],config,i));    processes.append(process);for process in processes:    process.start();for process in processes:    process.join();然而,當(dāng)多處理pickles對象時,這會導(dǎo)致它自己的問題: AttributeError: Can't pickle local object 'RunnerConfig.__init__.<locals>.<lambda>' 注意:config和RunnerConfig是兩個不同的東西;一個來自我正在使用的簡潔庫,它是傳遞給函數(shù)的配置,另一個是我自己的類,它是進程啟動的類的屬性。經(jīng)過一番研究,似乎因為我使用的是類方法,所以多處理pickle了該類,其中包括上面的RunnerConfig,其中包含lambda函數(shù),這些函數(shù)是不可pickle的。這是非常難以解決的,因為這些 lambda 函數(shù)是專門在self.eval_genome_batch 中使用的。這就引出了第二個問題:是否可以以不需要對外部類進行pickle的方式使用multiprocessing.Process,這樣lambda函數(shù)就不會被pickle?最后,經(jīng)過更多研究,事實證明,我可以使用 pathos.multiprocessing ,而不是使用 pickle 的 multiprocessing ,它使用 dill 。Dill可以腌制 lambda 函數(shù)。萬歲!但不是。最后還有一個操你媽的。Pathos.multiprocessing 僅具有來自 multiprocessing 的 .map 和 .map 等效函數(shù),這不允許我控制進程本身。這意味著當(dāng)調(diào)用該函數(shù)時,沒有辦法(據(jù)我所知)告訴程序正在運行游戲的進程 ID,以及是否渲染到屏幕。所以最后一個問題是:有沒有一種方法可以使用 pathos.multiprocessing.map (或者實際上是任何庫并行函數(shù)),a) 不會破壞 lambda 函數(shù),b) 可以告訴被調(diào)用的函數(shù)是哪個進程ID正在被使用?最后一點:我知道最簡單的答案就是不渲染到 Pygame。這將解決所有問題。然而,能夠看到項目的進展和學(xué)習(xí)對我來說非常有用和重要。所以,我列出了不同的問題,其中任何一個如果得到解決,都可以解決所有問題:一種在不同線程中使用 pygame 作為多個不同實例的方法,這些實例是從同一進程生成的一種安全地同時使用 pygame 的顯示(并更新時鐘)的方法一種使用 multiprocessing.Process 的方法,這樣它不需要腌制方法的類,但仍然可以訪問類變量一個多處理庫:要么不需要 pickle lambda 函數(shù),要么能夠有辦法告訴子進程正在使用哪個進程工作人員
查看完整描述

1 回答

?
慕桂英546537

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ù)器,主進程是客戶端。


查看完整回答
反對 回復(fù) 2023-10-25
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號