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()