【发布时间】:2013-05-05 06:51:44
【问题描述】:
我想使用 multiprocessing.Value 在多个进程中使用变量,但 Python 文档中的语法并不清楚。谁能告诉我应该使用什么类型(我的变量是一个字母),以及将变量名放在哪里?
编辑
我尝试使用管理器在进程之间共享我的信件。但是我现在唯一的东西是Value('ctypes.c_char_p', '(您在这里敲击的键)') 在 Python Shell 中打印,但仍然没有声音。
使用管理器时,控制台似乎也比平时慢了一点。从我击键到Value 出现在屏幕上之间有将近一秒的延迟。
我的代码现在看起来像这样:
#Import
from tkinter import *
import wave
import winsound
import multiprocessing
#Functions
def key(event):
temp = event.char
manager = multiprocessing.Manager()
manager.Value(ctypes.c_char_p, temp)
hitkey = manager.Value(ctypes.c_char_p, temp)
instance = multiprocessing.Process(target=player, args=(hitkey,))
instance.start()
def player(hitkey):
print(hitkey + "1")
winsound.PlaySound(hitkey + '.wav', winsound.SND_FILENAME|winsound.SND_NOWAIT|winsound.SND_ASYNC)
if __name__ == "__main__":
#Initialisation
fenetre = Tk()
frame = Frame(fenetre, width=200, height=100)
#TK
frame.focus_set()
frame.bind("<Key>", key)
frame.pack()
fenetre.mainloop()
【问题讨论】:
-
我对您标记为
initialization的代码部分感到困惑。模块顶层的global语句不执行任何操作。这是完全没有意义的。你打算让event和hitkey在那里? -
这是我忘记删除的旧声明。我认为这不会改变任何事情。
-
这里真的需要多处理吗?您当然不需要
Manager或value来将参数传递给新进程(只需让multiprocessing使用pickle传递字符串)。如果您只是从常规代码而不是在单独的进程中调用它,您的player函数是否有效?我根本不认识winsound,所以帮不了太多调试。 -
@Blckknght 我需要同时播放多个声音,而 Python 的 GIL 阻止了它。这就是我需要多处理的原因。
-
如果您使用相同的参数在单个进程中进行测试,
player函数是否有效?