2013-05-10 33 views
6

Tôi muốn sử dụng multiprocessing.Value để sử dụng một biến trong nhiều quy trình, nhưng cú pháp không rõ ràng trên tài liệu của Python. Bất cứ ai có thể cho tôi biết những gì tôi nên sử dụng như là loại (biến của tôi là một lá thư), và nơi để đặt tên biến của tôi?multiprocessing.value rõ ràng cú pháp?

EDIT

Tôi đã cố gắng sử dụng Trình quản lý để chia sẻ thư giữa các quy trình. Nhưng điều duy nhất tôi có bây giờ là Value('ctypes.c_char_p', ' (Phím bạn nhấn ở đây) ') được in trong vỏ Python và vẫn không có âm thanh. Bảng điều khiển cũng có vẻ chậm hơn một chút so với bình thường khi sử dụng trình quản lý. Có một sự chậm trễ gần một giây giữa thời gian tôi nhấn phím và khi Value xuất hiện trên màn hình.

Mã của tôi bây giờ trông như thế này:

#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

Tôi bị nhầm lẫn bởi phần mã bạn đã gắn nhãn 'initialization'. Câu lệnh 'global' ở cấp cao nhất của mô-đun không làm gì cả. Nó hoàn toàn vô nghĩa. Bạn có ý định gì cho 'event' và' hitkey' ở đó? – Blckknght

+0

Đây là một tuyên bố cũ mà tôi quên xóa. Tôi không nghĩ rằng nó sẽ thay đổi bất cứ điều gì. – Pollux

+0

Bạn có thực sự cần đa xử lý ở đây không? Bạn chắc chắn không cần 'Manager' hoặc' value' chỉ để chuyển đối số cho một tiến trình mới (chỉ cần để 'multiprocessing' truyền chuỗi bằng' pickle').Chức năng 'player' của bạn có hoạt động không nếu bạn đơn giản gọi nó từ mã thông thường, chứ không phải trong một tiến trình riêng biệt? Tôi không biết 'thắng lợi' chút nào, vì vậy tôi không thể giúp quá nhiều trong việc gỡ lỗi nó. – Blckknght

Trả lời

7

Không có cú pháp đặc biệt cho multiprocessing.Value, nó chỉ là một lớp giống như bất kỳ khác. Các chữ ký của các nhà xây dựng Valuehoàn toàn tốt mô tả:

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”.

Bạn thậm chí có một số ví dụ về việc sử dụng nó afterwards. Trong particolar các typecode_or_type có thể là một trong những typecodes được liệt kê trong tài liệu cho các mô-đun array (ví dụ 'i' cho số nguyên ký, 'f' cho phao vv) hoặc một loại ctypes, như ctypes.c_int, vv

Nếu bạn muốn có một Value chứa một chữ cái bạn có thể làm:

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

cập nhật

vấn đề với mã của bạn là typecode 'c' có nghĩa là ký tự không phải là chuỗi. Nếu bạn muốn tổ chức một chuỗi, bạn có thể sử dụng các loại 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

Đã thử nó, nhưng sau đó tôi đã có một lỗi trong dòng đa xử lý của tôi: 'Ngoại lệ trong Tkinter gọi lại Traceback (cuộc gọi gần đây nhất): Tệp" C: \ Program Files (x86) \ Python \ lib \ tkinter \ __ init__.py ", dòng 1399, trong __call__ trả lại self.func (* args) Tệp" G: \ Projet final \ Test audio \ test4-2.py ", dòng 16, trong khóa hitkey = multiprocessing.Value ('c', temp, False) ' – Pollux

+0

' Tệp "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ __ init__.py", dòng 252, Giá trị trả về Giá trị (typecode_or_type, * args, ** kwds) Tệp "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ sharedctypes.py", dòng 96, trong Giá trị obj = RawValue (typecode_or_type, * args) Tệp "C: \ Program Files (x86) \ Python \ lib \ multiprocessing \ sharedctypes.py ", dòng 73, trong RawValue obj .__ init __ (* args) LoạiError: __init__ được mong đợi nhiều nhất là 1 đối số, có 2' – Pollux

+0

@FalafHellFalafHell Bạn đang làm điều gì sai. * Hiện chúng tôi mã * – Bakuriu

1

Tôi nghĩ rằng vấn đề ban đầu bạn đã có (gây ra TypeError) là vì lock lập luận để các nhà xây dựng multiprocessing.Value là một đối số từ khóa chỉ . Bạn cần gọi số multiprocessing.Value("c", temp, lock=False) để làm điều bạn muốn làm.

Tuy nhiên, tôi không nghĩ bạn cần sử dụng đối tượng Value. Bạn đang chuyển mã khóa làm đối số cho quá trình khác của mình và không sử dụng được tất cả Value. Tôi muốn loại bỏ hoàn toàn nó:

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

Tôi đã thử 'hitkey = multiprocessing.Value ('c', temp, lock = False)', tôi có lỗi 'TypeError: một chuỗi ký tự được mong đợi'. Tôi cũng đã thử mà không có đối tượng 'Value', và một lần nữa, không có âm thanh phát. – Pollux

+0

Như tôi đã chỉ ra trong câu trả lời của tôi vấn đề là ''c'' mong đợi một nhân vật * duy nhất *, trong khi Falaf đang đi qua trong một chuỗi. Sử dụng tác vụ 'ctypes.c_char_p'. – Bakuriu

+0

Phải, tôi đã quên. Đã sửa nó, nhưng vẫn có 'TypeError: loại này không có size'. – Pollux

Các vấn đề liên quan