2010-01-12 30 views
41
import subprocess 

def my_function(x): 
    return x + 100 

output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments 
print output 
#desired output: 101 

Tôi chỉ tìm thấy tài liệu về việc mở các quy trình con bằng cách sử dụng các tập lệnh riêng biệt. Có ai biết làm thế nào để vượt qua các đối tượng chức năng hoặc thậm chí một cách dễ dàng để vượt qua mã chức năng?Có thể chạy hàm trong một tiến trình con mà không cần luồng hoặc viết một tệp/tập lệnh riêng biệt.

+1

Tôi tin rằng bạn đang tìm kiếm mô-đun [đa xử lý] (http://docs.python.org/3.1/library/multiprocessing.html). –

Trả lời

65

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó giống như các mô-đun đa:

http://docs.python.org/library/multiprocessing.html#the-process-class

Các module subprocess là cho các quá trình sinh sản và làm những việc với đầu vào/đầu ra của họ - không cho các chức năng chạy.

Đây là một phiên bản multiprocessing mã của bạn:

from multiprocessing import Process, Queue 

def my_function(q, x): 
    q.put(x + 100) 

if __name__ == '__main__': 
    queue = Queue() 
    p = Process(target=my_function, args=(queue, 1)) 
    p.start() 
    p.join() # this blocks until the process terminates 
    result = queue.get() 
    print result 
+13

Bạn có thể sử dụng trang trí 'processify' làm lối tắt: https://gist.github.com/2311116 – schlamar

+1

Tôi giả định rằng bản sao này là trình thông dịch Python và tất cả môi trường của nó cho tiến trình con? – Jens

+0

Đây là một nhánh của processify hoạt động trong python 3 và hỗ trợ các chức năng của máy phát. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

Bạn có thể sử dụng các tiêu chuẩn Unix fork gọi hệ thống, như os.fork(). fork() sẽ tạo một quy trình mới, với cùng một tập lệnh đang chạy. Trong quá trình mới, nó sẽ trả về 0, trong khi trong quá trình cũ nó sẽ trả về ID tiến trình của tiến trình mới.

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

Đối với thư viện cấp cao hơn, cung cấp khả năng trừu tượng di động để sử dụng nhiều quy trình, có mô-đun multiprocessing. Có một bài viết về IBM DeveloperWorks, Multiprocessing with Python, với phần giới thiệu ngắn gọn về cả hai kỹ thuật. bài trên

+0

Tôi rất tò mò; tại sao downvote? Có gì sai trong câu trả lời của tôi không? –

+0

Đa xử lý không chỉ là trình bao bọc cấp cao hơn xung quanh ngã ba(), đây là bộ công cụ đa xử lý đa nền tảng (sử dụng fork trên unix). Điều này quan trọng, bởi vì điều này có nghĩa là nó chạy trên Windows, trong khi fork() thì không. Chỉnh sửa: Và đây là lý do cho downvote, mặc dù sau này tôi quyết định nó có lẽ không đáng giá. Quá muộn để lấy lại nó, mặc dù. Chỉnh sửa2: Hay đúng hơn, ngã ba() được đề xuất khi không phải là nền tảng chéo là lý do. –

+1

@Devin, bạn luôn có thể lấy lại một downvote bạn đã làm, nếu bạn muốn. –

3

Brian McKenna về đa là thực sự hữu ích, nhưng nếu bạn muốn đi xuống con đường ren (trái ngược với quá trình dựa), ví dụ này sẽ giúp bạn bắt đầu:

import threading 
import time 

def blocker(): 
    while True: 
     print "Oh, sorry, am I in the way?" 
     time.sleep(1) 

t = threading.Thread(name='child procs', target=blocker) 
t.start() 

# Prove that we passed through the blocking call 
print "No, that's okay" 

Bạn cũng có thể sử dụng tính năng setDaemon(True) để chạy nền ngay lập tức.

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