2009-11-18 27 views
8

Tôi muốn tạo một quy trình bằng cách sử dụng mô-đun mutliprocessing trong python nhưng đảm bảo nó tiếp tục chạy sau khi quá trình tạo ra các tiến trình con.Gỡ bỏ một tiến trình con bắt đầu bằng cách sử dụng mô-đun đa xử lý python

Tôi có thể nhận được chức năng bắt buộc bằng cách sử dụng mô-đun tiến trình con và Popen, nhưng tôi muốn chạy mã của tôi dưới dạng hàm, không phải là tập lệnh. Lý do tôi muốn làm điều này là đơn giản hóa việc tạo các đối tượng pyro (python remote objects). Tôi muốn bắt đầu xử lý yêu cầu đối tượng pyro trong một quá trình riêng biệt bằng cách sử dụng đa xử lý, nhưng sau đó tôi muốn quá trình chính thoát ra trong khi quá trình hỗ trợ đối tượng pyro tiếp tục chạy.

Trả lời

0

Những gì bạn đang cố gắng làm là bắt đầu quá trình daemon. Nhìn vào PEP-3143 và gói python-daemon.

Took một cái nhìn vào Pyro, và có vẻ như họ bao gồm các module daemonzing riêng của họ,

Pyro/ext/daemonizer.py 
+0

Cảm ơn bạn đã trả lời. Đã tự mình tìm ra giải pháp đó, tôi đồng ý. Tuy nhiên, python-daemon dường như được nhắm mục tiêu đến mô hình chuẩn hơn, nơi một chương trình có một hàm được khởi động như một daemon và không bao giờ trả về. Tôi muốn làm điều gì đó dọc theo dòng: với daemon.DaemonContext(): some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Tôi đánh giá cao bất cứ đề nghị. – glenn

+0

Tôi đã không thực sự nhìn vào pyro trước. Từ một cái nhìn lướt qua mã của họ, lớp "daemon" giống như một điều phối luồng, và không phải là một quá trình riêng biệt; không có nơi nào trong mã nó không bao giờ ngã ba. Pyro có một mô-đun đi kèm với chức năng daemon thực daemon. – JimB

4

cuối cùng tôi nhận được những gì tôi muốn. Tôi đánh giá cao bất kỳ đề xuất nào để cải thiện mã.

def start_server(): 
    pyrodaemon = Pyro.core.Daemon() 
    #setup daemon and nameserver 
    #Don't want to close the pyro socket 
    #Need to remove SIGTERM map so Processing doesn't kill the subprocess 
    #Need to explicitly detach for some reason I don't understand 
    with daemon.DaemonContext(files_preserve=[pyrodaemon.sock],signal_map={signal.SIGTERM:None},detach_process=True): 
     while running: 
      pyrodaemon.handleRequests(timeout=1.0) 
    #when finished, clean up 
    pyrodaemon.shutdown() 

def main(): 
    p = Process(target=start_server) 
    p.daemon=True # Need to inform Process that this should run as a daemon 
    p.start() 
    time.sleep(3.0) # Important when running this program stand alone: Must wait long enough for start_server to get into the daemon context before the main program exits or Process will take down the subprocess before it detaches 
    do_other_stuff_not_in_the_daemon() 
+1

Từ daemon đang bị lạm dụng ở đây;) * Không * đặt Process.daemon thành True. Điều đó nói với đa xử lý để cố gắng giết đứa trẻ lúc thoát (khó hiểu huh?). Tôi nghĩ rằng đây là lý do tại sao bạn cần phải nắm bắt SIGTERM và thiết lập detach_process trong đoạn mã trên. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB

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