2011-08-25 62 views
11

Tôi đang cố gắng hiểu đa xử lý trong python.Gán giá trị trả về của hàm cho một biến, với đa xử lý? Và một vấn đề về IDLE?

from multiprocessing import Process 

def multiply(a,b): 
    print(a*b) 
    return a*b 

if __name__ == '__main__': 
    p = Process(target= multiply, args= (5,4)) 
    p.start() 
    p.join() 
    print("ok.") 

Trong codeblock này, ví dụ, nếu có một biến mà được gọi là "kết quả". Làm thế nào chúng ta có thể gán giá trị trả về của hàm nhân với "kết quả"?

Và một chút vấn đề về IDLE: khi tôi cố chạy mẫu này bằng Python Shell, nó không hoạt động đúng cách? Nếu tôi nhấn đúp chuột vào tập tin py, đầu ra là như thế:

20 
ok. 

Nhưng nếu tôi cố gắng chạy này trong IDLE:

ok. 

Thanks ...

+0

Phần IDLE là một riêng biệt câu hỏi (và có thể do IDLE chuyển hướng stdout thực hiện/phải làm, điều này rất khó thực hiện đối với các quá trình mà mã của bạn sinh ra). – delnan

Trả lời

13

Ok, tôi bằng cách nào đó quản lý điều này. Tôi nhìn vào tài liệu python, và tôi đã học được rằng: với việc sử dụng lớp Queue, chúng ta có thể nhận được các giá trị trả về từ một hàm. Và phiên bản cuối cùng của mã của tôi giống như sau:

from multiprocessing import Process, Queue 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    p = Process(target= multiply, args= (5,4,queue1)) #we're setting 3rd argument to queue1 
    p.start() 
    print(queue1.get()) #and we're getting return value: 20 
    p.join() 
    print("ok.") 

Và cũng có một hàm(), tôi nghĩ chúng ta cũng có thể sử dụng chức năng đường ống. Nhưng hàng đợi làm việc cho tôi, bây giờ.

5

Điều này có hữu ích không? Này có một danh sách các hàm (và lý lẽ của họ), chạy chúng song song, và trả về kết quả đầu ra của họ .: (Đây là cũ. Phiên bản mới hơn Phần lớn trong số này là ở https://github.com/cpbl/cpblUtilities/blob/master/parallel.py)

def runFunctionsInParallel(listOf_FuncAndArgLists): 
    """ 
    Take a list of lists like [function, arg1, arg2, ...]. Run those functions in parallel, wait for them all to finish, and return the list of their return values, in order. 

(This still needs error handling ie to ensure everything returned okay.) 

    """ 
    from multiprocessing import Process, Queue 

    def storeOutputFFF(fff,theArgs,que): #add a argument to function for assigning a queue 
     print 'MULTIPROCESSING: Launching %s in parallel '%fff.func_name 
     que.put(fff(*theArgs)) #we're putting return value into queue 

    queues=[Queue() for fff in listOf_FuncAndArgLists] #create a queue object for each function 
    jobs = [Process(target=storeOutputFFF,args=[funcArgs[0],funcArgs[1:],queues[iii]]) for iii,funcArgs in enumerate(listOf_FuncAndArgLists)] 
    for job in jobs: job.start() # Launch them all 
    for job in jobs: job.join() # Wait for them all to finish 
    # And now, collect all the outputs: 
    return([queue.get() for queue in queues]) 
+0

đề xuất tuyệt vời, tôi đã sử dụng nó để xử lý video tại đây: http://stackoverflow.com/questions/38203239/multiprocessing-of-video-frames-in-python. Tuy nhiên, điều này chỉ hoạt động đối với tôi mà không cần tham gia các quy trình trước khi đưa hàng đợi - cũng được đề cập trong tài liệu: https://docs.python.org/2/library/multiprocessing.html#programming-guidelines – jlarsch

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