2016-12-07 16 views
0

私はマルチターンの竜巻Webサーバーを持っています。バックグラウンドでいくつかのことを行う別のプロセスを作成したいと思います。竜巻Webサーバーでプロセスを作成する

私はコード

start_background_process 
app = Application([<someurls>]) 
server = HTTPServer(app) 
server.bind(8888) 
server.start(4) # Forks multiple sub-processes 
IOLoop.current().start() 

def start_background_process(): 
    process = multiprocessing.Process(target=somefunc) 
    process.start() 

、すべてが素晴らしい働いている次のようにサーバーを持っています。しかし 私は(CRTL cでまたは信号を送る)サーバーを閉鎖しようと 私はこの問題の原因を理解AssertionError: can only join a child process

を得る: 私はマルチプロセスとプロセスのコールをプロセスを作成する方法 に参加しています「atexit」に登録されています。竜巻はシンプルなフォークを実行するため、すべての子どもも作成したプロセスの結合メソッドを呼び出します。プロセスは兄弟であり、息子ではないのでできません。 それでは、どのように通常どおりに竜巻でプロセスを開くことができますか?

答えて

2

、そのsource codeに見られるように4つのサブプロセスをフォークするos.forkを使用「HTTPTserver開始」。

すべての4つのサブプロセスでメソッドを実行する場合は、プロセスがforkされた後にメソッドを呼び出す必要があります。

心の中であなたのコードは以下のように見えるように変更することができることを持つ:

import multiprocessing 
import tornado.web 
from tornado.httpserver import HTTPServer 
from tornado.ioloop import IOLoop 

# A simple external handler as an example for completion 
from handlers.index import IndexHandler 


def method_on_sub_process(): 
    print("Executing in sub-process") 


def start_background_process(): 
    process = multiprocessing.Process(target=method_on_sub_process) 
    process.start() 


def main(): 
    app = tornado.web.Application([(r"/", IndexHandler)]) 
    server = HTTPServer(app) 
    server.bind(8888) 
    server.start(4) 
    start_background_process() 
    IOLoop.current().start() 


if __name__ == "__main__": 
    main() 

さらに試してみることでサーバのインスタンス化を囲んで、任意のキーボードの中断中にきれいにあなたのプログラムの動作を維持します。 ..exceptの句は以下のようになります。

def main(): 
    try: 
     app = tornado.web.Application([(r"/", IndexHandler)]) 
     server = HTTPServer(app) 
     server.bind(8888) 
     server.start(4) 
     start_background_process() 
     IOLoop.current().start() 
    except KeyboardInterrupt: 
     IOLoop.instance().stop() 
+0

あなたの答えをありがとう。本当に良い:) –

+0

答えをありがとうが、あなたの答えでは、4つのバックグラウンドプロセスを開きませんか?私は1つだけ開きたいと思うなぜ私は開始前にそれをした – kill129

+0

ええ、それは正しいです。その場合、私は[Process Pool](https://docs.python.org/2/library/multiprocessing.html?highlight=pool#module-multiprocessing.pool)の使用を提案していました。 2つのワーカープロセス 'pool = multiprocessing.Pool(2)'を作成し、 'somefunc'を' pool.apply_async(method_on_sub_process、()) 'と呼び、' second'を使ってあなたの竜巻サーバのインスタンス化を呼び出すことができます。キーボード割り込みでは、 'poll.terminate()'を使ってワーカープロセスを終了させることができます。私はいくつかの助けになったことを願っている。 – afxentios

関連する問題