12

我想使用 multiprocessing.Value 在多个进程中使用一个变量,但是 Python 的文档中的语法并不清楚。谁能告诉我我应该使用什么类型(我的变量是一个字母),以及在哪里放置我的变量名?

编辑

我尝试使用 Manager 在进程之间共享我的信件。但我现在唯一拥有的是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()
4

2 回答 2

15

没有特殊的语法multiprocessing.Value,它只是一个和其他类一样的类。构造函数的签名得到了很好的描述Value

multiprocessing.Value(typecode_or_type, *args[, lock])

返回ctypes从共享内存分配的对象。默认情况下,返回值实际上是对象的同步包装器。

typecode_or_type确定返回对象的类型:它是模块使用的ctypes类型或单字符类型代码array*args被传递给该类型的构造函数。

如果lockTrue(默认值),则创建一个新的锁对象以同步对值的访问。如果 lock 是一个LockRLock对象,那么它将用于同步对值的访问。如果lock是,False那么对返回对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”。

你甚至有一些事后使用它的例子。特别是,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'表示字符而不是字符串。如果你想保存一个字符串,你可以使用 type 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!'

对于 Python 3,使用c_wchar_p代替c_char_p

于 2013-05-10T14:51:26.340 回答
2

我认为您遇到的原始问题(导致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()
于 2013-05-11T14:44:22.313 回答