私が書いたudpサーバーのテストハーネスを書いています。アイデアは、 multiprocessing.pool を使用して、サーバーの複数のインスタンスに対して subprocess.call コマンドを実行することです(この質問による)。udp サーバーは、3 つのプロセス (メイン、http インターフェイス、および udp サーバー) で構成される別の python プログラムです。テスト スクリプトを作成しようとして、CTRL + C でテスト スクリプトを強制終了すると、アクティビティ モニターで常に 2 ~ 5 個の python2.7 プロセスがハングします。
私の試み:
- バニラサブプロセス
- 端末に接続されていない bash を処理するサブプロセス (この質問を参照)
- multiprocess.pool は、単純な test.py スクリプトを使用してハング プロセスも作成します (以下を参照)。
サーバーコードにサブプロセスキルを追加しようとしましたが、役に立ちませんでした。端末内でサーバーを実行すると、CTRL+C に正しく応答します。(1)と(2)はtest.pyスクリプトに問題がないので、サーバー内の子プロセスに何かあると思います。
1)サブプロセスを使用するだけ:
args0 = [sys.executable, server_path, '-p', '7000', '-t', '8000', '-u', '9000']
args1 = [sys.executable, server_path, '-p', '7001', '-t', '8001', '-u', '9001']
p0 = subprocess.Popen(args0)
p1 = subprocess.Popen(args1)
2) stdout、pipe、os.kill でサブプロセスを使用する:
p0 = subprocess.Popen( args0,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
close_fds=True)
print "running for 5s..."
time.sleep(5)
os.kill(p0.pid, signal.SIGTERM)
3a) test_harness.py (プールあり)
import sys, os, time
import subprocess, multiprocessing
def work(cmd):
return subprocess.call(cmd) # , shell=False
def main():
server_path = os.getcwd() + '/' + 'test.py'
args0 = [sys.executable, server_path, '-p', '7000']
# args1 = [sys.executable, server_path, '-p', '7001']
tasks = [args0]
pool = multiprocessing.Pool(processes=1)
pool.map_async(work, tasks)
time.sleep(3)
pool.terminate()
if __name__ == '__main__':
main()
3b) test.py
def main():
while True:
a = 1
if __name__ == '__main__':
main()