进程如何获取python中全局变量的当前值?
Posted
技术标签:
【中文标题】进程如何获取python中全局变量的当前值?【英文标题】:How can a process get the current value of a global variable in python? 【发布时间】:2021-03-02 20:41:18 【问题描述】:我的代码是这样的:
import pygame
from multiprocessing import Process, Queue
#dosomething
#dosomething
def keyboard():
keys_pressed = q.get()
if key_pressed[pygame.K_a]:
#dosomething
q = Queue()
keyboard_process = Process(target=keyboard)
keyboard_process.start()
while True:
q.put(pygame.key.get_pressed())
#dosomething
keyboard_process.join()
#dosomething
但是,“q”的值总是[0, 0, ......, 0],即使我按“A”。“keyboard_process.join()”总是什么都不做。所以游戏不工作。
请帮帮我。
【问题讨论】:
相关***.com/a/63649298/13782669 您实际上并没有将队列传递给子进程,将调用更改为Process(target=keyboard, args=(q, ))
,当然还有def keyboard(q):
@Nullman 但这没用。
@QWERTY_52_38 我建议不要在 pygame 中使用进程或线程,除非您了解 SDL2 对它们的所有限制。对于您的情况,实际上根本不需要启动新流程。它会使游戏变得更慢、更难调试、更难推理并且更容易出现错误。正如您所注意到的,您将遇到难以解决的问题,例如您的问题中的问题。只需使用事件循环并处理游戏循环中的事件。
【参考方案1】:
简短的回答是:“不”。
当您启动一个单独的子进程时,它会获得父内存空间的完整副本。一旦开始,它就完全独立于父母。父/子通信的唯一方法是使用某种进程间通信机制——管道、共享内存、网络套接字、文件等。
但是如果你启动一个单独的处理线程,所有线程共享相同的内存。
在@humble_D 的答案被删除之前,它有一个很好的链接到一个相关的答案,详细说明了一些进程间通信的方法。参考:multiprocessing: sharing a large read-only object between processes?
说实话,如果您正在认真考虑将 PyGame 用于新游戏,它可能不需要多处理。如果需要发生一些超级 CPU 绑定的子进程,您最好用本机二进制编译语言(例如:C/C++/Rust)编写这部分并将其作为子进程启动。
但首先,只需编写你的游戏,然后优化慢的部分。
【讨论】:
以上是关于进程如何获取python中全局变量的当前值?的主要内容,如果未能解决你的问题,请参考以下文章