2013-05-10 9 views
6

Chcę użyć metody wieloprocesowej. Aby użyć zmiennej w wielu procesach, ale składnia nie jest jasna w dokumentacji Pythona. Czy ktoś może mi powiedzieć, co powinienem użyć jako typu (moja zmienna to litera) i gdzie umieścić nazwę mojej zmiennej?multiplerocessing.value jasna składnia?

EDIT

Próbowałem za pomocą Menedżera dzielić mój list między procesami. Ale jedyne, co teraz mam, to Value('ctypes.c_char_p', ' (klucz, który tu trafiłeś) ') wydrukowany w powłoce Pythona i wciąż nie ma dźwięku. Konsola wydaje się również nieco wolniejsza niż zwykle podczas korzystania z menedżera. Między momentem, w którym uderzyłem w klawisz, a chwilą, gdy na ekranie pojawi się Value, występuje prawie jedna sekundowa zwłoka.

Mój kod wygląda teraz tak:

#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

Jestem zdezorientowany przez sekcję twojego kodu, którą nazwałeś "inicjalizacją". Wyrażenie 'global' na najwyższym poziomie modułu nic nie robi. To zupełnie bez znaczenia. Co masz zamiar na "event" i "hitkey"? – Blckknght

+0

To jest stare stwierdzenie, którego zapomniałem usunąć. Nie sądzę, żeby to zmieniło cokolwiek. – Pollux

+0

Czy naprawdę potrzebujesz tutaj przetwarzania wieloprocesowego? Na pewno nie potrzebujesz 'Menedżera' lub' wartości' tylko po to, aby przekazać argument do nowego procesu (po prostu pozwól, aby 'multiprocessing' przekazał ciąg znaków za pomocą' pickle').Czy twoja funkcja 'player' działa, jeśli po prostu nazywasz ją zwykłym kodem, a nie oddzielnym procesem? W ogóle nie znam 'winsound', więc nie mogę pomóc zbyt wiele w debugowaniu go. – Blckknght

Odpowiedz

7

Nie ma specjalnego składnia multiprocessing.Value, to po prostu klasa jak każda inna. podpis konstruktora Value jest doskonale opisane:

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

Return a ctypes object allocated from shared memory. By default the return value is actually a synchronized wrapper for the object.

typecode_or_type determines the type of the returned object: it is either a ctypes type or a one character typecode of the kind used by the array module. *args is passed on to the constructor for the type.

If lock is True (the default) then a new lock object is created to synchronize access to the value. If lock is a Lock or RLock object then that will be used to synchronize access to the value. If lock is False then access to the returned object will not be automatically protected by a lock, so it will not necessarily be “process-safe”.

nawet mieć kilka przykładów jego zastosowania afterwards. W particolar typecode_or_type może być jedną z typecodes, które są wymienione w dokumentacji modułu array (np 'i' dla podpisana całkowitą, 'f' dla pływaka itp) lub typu ctypes, jak ctypes.c_int itp

Jeśli chcesz mają Value zawierający pojedynczą literę można zrobić:

>>> import multiprocessing as mp 
>>> letter = mp.Value('c', 'A') 
>>> letter 
<Synchronized wrapper for c_char('A')> 
>>> letter.value 
'A' 

Aktualizacja

problem z kodem jest, że kod typu 'c' oznacza ciąg znaków , nie. Jeśli chcesz trzymać ciąg można użyć typu 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!' 
+0

Próbowałem, ale potem mam błąd w mojej linii kodu wieloprocesowego: 'Wyjątek w wywołaniu zwrotnym Tkinter Prześledzenie (ostatnie ostatnie połączenie): Plik" C: \ Program Files (x86) \ Python \ lib \ tkinter \ __ init__.py ", wiersz 1399, w __call__ return self.func (* args) Plik" G: \ Projet final \ Test audio \ test4-2.py ", wiersz 16, klucz hitkey = multiprocessing.Value ('c', temp, False) ' – Pollux

+0

' Plik "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ __ init__.py", wiersz 252, w Wartość wartość zwracana (typecode_or_type, * args, ** kwds) Plik "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ sharedctypes.py", wiersz 96, w Wartość obj = RawValue (typecode_or_type, * args) Plik "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ sharedctypes.py ", wiersz 73, w RawValue obj .__ init __ (* args) TypeError: __init__ spodziewano się co najwyżej 1 argumentu, ale otrzymałem 2' – Pollux

+0

@FalafHellFalafHell Robisz coś złego. * Pokaż nam kod * – Bakuriu

1

Myślę, że oryginalny problem miałaś (powodując TypeError) był ponieważ lock argument konstruktora multiprocessing.Value jest argumentem słowa kluczowego tylko . Musisz zadzwonić pod numer multiprocessing.Value("c", temp, lock=False), aby zrobić to, co chcesz zrobić.

Jednak nie sądzę, aby w ogóle używać obiektu Value. Kod jest przekazywany jako argument do innego procesu, a kod Value nie jest w ogóle używany. Pozbyłbym się go całkowicie:

def key(event): 
    instance = multiprocessing.Process(target=player, args=(event.char,)) 
    instance.start() 
+0

Próbowałem 'hitkey = multiplerocessing.Value ('c', temp, lock = False)', Mam błąd 'TypeError: jeden ciąg znaków''. Próbowałem również bez obiektu "Value" i znowu nie odtwarzałem dźwięku. – Pollux

+0

Jak już wskazałem w mojej odpowiedzi, problem polega na tym, że '' c'' oczekuje znaku * pojedynczego *, podczas gdy Falaf przekazuje ciąg znaków. Używanie 'ctypes.c_char_p' działa. – Bakuriu

+0

Dobrze, zapomniałem. Naprawiono to, ale nadal istnieje "TypeError: ten typ nie ma rozmiaru". – Pollux