2013-02-27 30 views
45

Tôi có một quá trình chính tạo ra hai hoặc nhiều quy trình phụ, tôi muốn quá trình chính chờ đợi cho đến khi tất cả các quy trình phụ hoàn tất các hoạt động và thoát của chúng?chờ quá trình cho đến khi tất cả các tiến trình con kết thúc?

# main_script.py 

p1 = subprocess.Popen(['python script1.py']) 
p2 = subprocess.Popen(['python script2.py']) 
... 
#wait main process until both p1, p2 finish 
... 
+4

sử dụng phương thức chờ: 'p1.wait(); p2.wait() ' –

+1

kiểm tra câu hỏi này: http://stackoverflow.com/questions/6341358/subprocess-wait-not-waiting-for-popen-process-to-finish-when-using-threads – Calum

+2

http: //stackoverflow.com/questions/100624/python-on-windows-how-to-wait-for-multiple-child-processes – Gjordis

Trả lời

69

Một đối tượng Popen có một phương pháp .wait() chính xác được xác định cho việc này: chờ đợi để hoàn thành một tiến trình con nhất định (và, bên cạnh , để retuning trạng thái thoát của nó).

Nếu bạn sử dụng phương pháp này, bạn sẽ ngăn chặn quá trình zombie nằm xung quanh quá lâu.

(Hoặc, bạn có thể sử dụng subprocess.call() hoặc subprocess.check_call() để gọi và chờ. Nếu bạn không cần IO với quy trình, điều đó có thể là đủ. Nhưng có lẽ đây không phải là một tùy chọn, vì nếu hai quy trình con của bạn dường như được cho là chạy song song, mà họ sẽ không có (check_) call().)

Nếu bạn có một vài subprocesses chờ, bạn có thể làm

exit_codes = [p.wait() for p in p1, p2] 

trả về càng sớm càng tất cả các quy trình con có đã kết thúc. Sau đó, bạn có danh sách các mã trả lại mà bạn có thể đánh giá.

+6

Câu hỏi đặt ra là cách chờ * tất cả * các quy trình con, không chỉ một. –

+2

@GregWard Nếu tôi chờ đợi một vài điều, tôi có thể chờ đợi liên tục. Đặc biệt trong tình huống này. – glglgl

+2

Và tôi không nghĩ rằng việc thiếu chi tiết này làm cho câu trả lời trở nên bất tiện. – glglgl

12
subprocess.call 

Tự động chờ đợi, bạn cũng có thể sử dụng:

p1.wait() 
Các vấn đề liên quan