进程如何获取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中全局变量的当前值?的主要内容,如果未能解决你的问题,请参考以下文章

Python核心编程总结(五多任务编程之进程与线程)

Python核心编程总结(五多任务编程之进程与线程)

如何通过多进程共享(或排除共享)全局变量?

如何获取 LLVM 全局变量常量值?

jsp页面如何获js中if语句的变量值

微信小程序WXML页面如何获取全局变量值