我想使用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()
答案 0 :(得分:10)
multiprocessing.Value
没有特殊的语法,它只是一个类似于任何其他的类。 Value
构造函数的签名是完美描述的:
multiprocessing.Value(typecode_or_type, *args[, lock])
返回从共享内存分配的
ctypes
对象。默认情况下,返回值实际上是对象的同步包装器。
typecode_or_type
确定返回对象的类型:它是ctypes
类型或所使用类型的一个字符类型代码 由array
模块。*args
被传递给构造函数 类型。如果
lock
为True
(默认值),则会创建一个新的锁定对象以同步对该值的访问。如果锁定是Lock
或 然后,RLock
对象将用于同步对该对象的访问 值。如果lock
为False
,则访问返回的对象即可 不会被锁自动保护,因此不一定如此 是“过程安全的”。
你甚至有一些使用afterwards的例子。特别地,typecode_or_type
可以是array
模块的文档中列出的一个类型代码(例如'i'
表示有符号整数,'f'
表示浮点数等)或者一个ctypes
类型,例如ctypes.c_int
等。
如果您希望Value
包含单个字母,则可以执行以下操作:
>>> import multiprocessing as mp
>>> letter = mp.Value('c', 'A')
>>> letter
<Synchronized wrapper for c_char('A')>
>>> letter.value
'A'
<强>更新强>
代码的问题在于,类型代码'c'
表示字符不是字符串。
如果要保留字符串,可以使用类型ctypes.c_char_p
:
>>> import multiprocessing as mp
>>> import ctypes
>>> v = mp.Value('c', "Hello, World!")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/multiprocessing/__init__.py", line 253, in Value
return Value(typecode_or_type, *args, **kwds)
File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 99, in Value
obj = RawValue(typecode_or_type, *args)
File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 73, in RawValue
obj.__init__(*args)
TypeError: one character string expected
>>> v = mp.Value(ctypes.c_char_p, "Hello, World!")
>>> v
<Synchronized wrapper for c_char_p(166841564)>
>>> v.value
'Hello, World!'
答案 1 :(得分:1)
我认为您遇到的原始问题(导致TypeError
)是因为lock
构造函数的multiprocessing.Value
参数是仅关键字参数。您需要致电multiprocessing.Value("c", temp, lock=False)
,以便它能够做您想做的事情。
但是,我认为您根本不需要使用Value
对象。您将密钥代码作为参数传递给其他进程,而Value
根本没有被使用。我完全摆脱它:
def key(event):
instance = multiprocessing.Process(target=player, args=(event.char,))
instance.start()