multiprocessing.value ясный синтаксис?

Я хочу использовать multiprocessing.Value для использования переменной в нескольких процессах, но синтаксис не ясен в документации Python. Может кто-нибудь сказать мне, что я должен использовать в качестве типа (моя переменная является буквой), и где поставить имя моей переменной?

РЕДАКТИРОВАТЬ

Я попытался с помощью диспетчера поделиться своим письмом между процессами. Но единственное, что у меня сейчас есть Value('ctypes.c_char_p', '(Ключ вы нажали здесь)') напечатано в оболочке Python и до сих пор нет звука. Консоль также кажется немного медленнее, чем обычно, при использовании менеджера. Существует почти одна секунда задержки между моментом нажатия клавиши и 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()

2 ответа

Специального синтаксиса для multiprocessing.Value Это просто класс, как и любой другой. Подпись Value Конструктор прекрасно описан:

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

Вернуть ctypes объект выделен из разделяемой памяти. По умолчанию возвращаемое значение фактически является синхронизированной оболочкой для объекта.

typecode_or_type определяет тип возвращаемого объекта: это либо ctypes тип или односимвольный тип, используемый типом array модуль. *args передается конструктору для типа.

Если lock является True (по умолчанию), затем создается новый объект блокировки для синхронизации доступа к значению. Если блокировка Lock или же RLock затем объект, который будет использоваться для синхронизации доступа к значению. Если 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' означает символ, а не строку. Если вы хотите держать строку, вы можете использовать тип 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!'

Я думаю, что исходная проблема у вас возникла (вызывая 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()
Другие вопросы по тегам