1 回答
![?](http://img1.sycdn.imooc.com/5458502c00012d4a02200220-100-100.jpg)
TA贡献1848条经验 获得超10个赞
我将尝试解决主要问题。我对您的实际问题的理解非常有限,因为我不知道您的代码实际上是做什么的。
“一种在不同线程中使用 pygame 作为多个不同实例的方法,这些实例是从同一进程生成的”
这不起作用,因为 pygame 是基于SDL2构建的,SDL2 声明“您不应期望能够在主线程以外的任何线程上创建窗口、渲染或接收事件”。
“一种安全地同时使用 pygame 的显示(和更新时钟)的方法”
与上面相同,显示仅在主线程中工作。
“一种使用 multiprocessing.Process 的方法,这样它不需要腌制方法的类,但仍然可以访问类变量”
您可以使用类似的方法来pickle这些方法dill
,但在进程之间复制python对象的完整内容(对我来说)是错误的。我会寻求另一种解决方案。
“一个多处理库:”
1.要么不需要 pickle lambda 函数,要么能够
您需要使用序列化 Python 对象才能在进程之间发送它们。
2.有办法告诉子进程正在使用哪个进程worker
我不明白这是什么意思。
在我看来,这个问题可以通过更好地分离数据和可视化来解决。培训不应该了解任何可视化,因为它不依赖于您想要如何显示它。所以不应该有任何理由共享 pygame 显示。
完成此操作后,执行您想要执行的操作应该不会有太大问题(多线程总是会导致问题)。关于泡菜问题;我会尽量避免 pickling Python 对象和函数,而只是在线程和进程之间传递基本原语。看来您应该能够self.fitnessFromArray
使用简单的int
方法进行分配,并根据其值在线程/进程中进行最小/平均/最大计算。
如果你想进行线程化,那么主线程将负责渲染。它还会生成用于训练的线程。当线程完成时,它们将返回结果(或将其放入线程安全存储中),主线程将轮询数据并显示结果。如果训练完成的工作花费的时间超过一帧,则划分工作,以便每个线程仅进行部分训练,并且可以在下一帧停止的地方继续。
如果您想要单独的进程,则原理是相同的。主进程启动几个训练进程并通过套接字连接到它们。从套接字中,您可以轮询有关程序状态的信息并显示它。它基本上是一个客户端-服务器架构(尽管在本地主机上),其中训练脚本是服务器,主进程是客户端。
添加回答
举报