2

わかりました、これは少し非正統的であるか、私がただ愚かであるか、またはその両方である可能性があります:)

あるインスタンスでボトル サーバーをProcess起動し、別のインスタンスで小さな TFTP サーバーを起動する、非常に単純なセットアップを試みています。

#!/usr/bin/env python
import bottle
import sys
import tftpy
from multiprocessing import Process

def main():
    try:
        t = Process(target=bottle.run(host='0.0.0.0', port=8080))
        t.daemon = True
        t.start()
        t.join()
        h = Process(target=tftpy.TftpServer('/srv/tftp').listen('0.0.0.0', 69))
        h.start()
        h.join()

    except KeyboardInterrupt:
        sys.stdout.write("Aborted by user.\n")
        sys.exit(1)

if __name__ == "__main__":
    main()

私が完全に狂っていない限り、それらが並行して起動することを期待しています。実際には、ボトルが起動してすべてがロックされます。ボトルを終了すると、TFTP デーモンが起動します。

threadingモジュールでも同様のアプローチを試みましたが、ほぼ同じ結果が得られました。

私は何を間違っていますか?

4

2 に答える 2

6

いくつかの問題があります。

  • run()メインスレッドで呼び出します。args代わりに引数を渡す必要があります。

    Process(target=bottle.run, kwargs=dict(host='0.0.0.0', port=8080))
    
  • h.start() の前に t プロセスが終了するまでブロックする t.join() を呼び出します。代わりにすべてのプロセスが開始された後に参加する

  • bottle、tftpy は multiprocessing モジュールと互換性がない可能性があります。もしそうなら、サブプロセスモジュールを試すことができます
于 2012-10-23T00:10:35.093 に答える
0

まあ、あなたが達成しようとしていることを理解しているかどうかはわかりませんが、もし私があなたの立場にいたら、python-daemon パッケージを使用しようとします。

bottleと の両方をTFTPデーモン化できると思います。簡単なテストを探しているだけなので、python-daemon Web ページにある例で十分だと思います。

物事をデーモン化するというアイデアが本当に好きな場合は、プラットフォームに適したデーモン化アプローチについても検索することをお勧めします。この方法では、デーモンを OS にあるものに近づけることでデーモンを管理するための機能がいくつかあるからです。

簡単な例: http://troydhanson.wordpress.com/2012/08/21/minimal-sysvinit-launchd-and-upstart/

于 2012-10-23T00:20:42.287 に答える