2010-06-13 65 views
13

Tôi muốn một tập lệnh để bắt đầu một quy trình mới, sao cho quy trình mới tiếp tục chạy sau khi thoát tập lệnh ban đầu. Tôi hy vọng rằng tôi có thể sử dụng multiprocessing.Process để bắt đầu một quy trình mới và đặt daemon=True để tập lệnh chính có thể thoát trong khi quá trình được tạo tiếp tục chạy.Bắt đầu một quá trình riêng biệt

Nhưng có vẻ quá trình thứ hai sẽ bị chấm dứt khi tập lệnh chính thoát. Đây có phải là hành vi mong đợi hay tôi đang làm điều gì sai?

Trả lời

12

Từ các tài liệu Python:

Khi một quá trình thoát, nó cố gắng chấm dứt tất cả các tiến trình con ma quỉ của nó.

Đây là hành vi mong đợi.

+2

Cảm ơn, dường như tôi không RTFM đủ gần. – JacquesB

8

Nếu bạn đang ở trên một hệ thống unix, bạn có thể sử dụng os.fork:

import os 
import time 

pid=os.fork() 
if pid: 
    # parent 
    while True: 
     print("I'm the parent") 
     time.sleep(0.5)  
else: 
    # child 
    while True: 
     print("I'm just a child") 
     time.sleep(0.5) 

Chạy điều này tạo ra hai quá trình. Bạn có thể giết cha mẹ mà không giết chết đứa trẻ. Ví dụ, khi bạn chạy script bạn sẽ thấy một cái gì đó như:

% script.py 
I'm the parent 
I'm just a child 
I'm the parent 
I'm just a child 
... 

Dừng kịch bản với ctrl-Z:

^Z 
[1]+ Stopped     script.py 

Tìm số quá trình ID cho phụ huynh. Nó sẽ là nhỏ hơn của hai số quá trình ID kể từ khi cha mẹ đến đầu tiên:

% ps axuw | grep script.py 
unutbu 6826 0.1 0.1 33792 6388 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py 
unutbu 6827 0.0 0.1 33792 4352 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py 
unutbu 6832 0.0 0.0 17472 952 pts/24 S+ 15:09 0:00 grep --color=auto script.py 

Giết quá trình cha mẹ:

% kill 6826 

Restore script.py để foreground:

% fg 
script.py 
Terminated 

Bạn sẽ thấy quá trình con vẫn đang chạy:

% I'm just a child 
I'm just a child 
I'm just a child 
... 

Giết đứa trẻ (trong một nhà ga mới) với

% kill 6827 
+0

"Bạn có thể giết cha mẹ mà không giết chết đứa trẻ". Làm sao? –

+0

@MartinThoma: Tôi đã thêm chi tiết về cách thực hiện điều đó từ thiết bị đầu cuối ở trên. Nhiều hệ điều hành có một màn hình quá trình GUI có thể làm cho điều này dễ dàng hơn, nhưng những chi tiết đó sẽ là OS/GUI cụ thể. – unutbu

1

Dưới đây là một câu hỏi liên quan về SO, nơi một trong những câu trả lời đưa ra một giải pháp tốt đẹp cho vấn đề này:

"spawning process from python"

7

Simply sử dụng mô-đun subprocess:

import subprocess 
subprocess.Popen(["sleep", "60"]) 
Các vấn đề liên quan