私はPythonを初めて使用し、2つのタスクを同時に実行しようとしています。これらのタスクはWebサーバー上のページをフェッチするだけであり、一方が他方の前に終了する可能性があります。すべてのリクエストが処理されたときにのみ結果を表示したい。Linuxシェルでは簡単ですが、Pythonではどこにも行きません。私が読んだすべてのハウツーは、私のような初心者には黒魔術のように見えます。以下のbashスクリプトの単純さに比べて、それらはすべて私には複雑に見えます。
Pythonでエミュレートしたいbashスクリプトは次のとおりです。
# First request (in background). Result stored in file /tmp/p1
wget -q -O /tmp/p1 "http://ursule/test/test.php?p=1&w=5" &
PID_1=$!
# Second request. Result stored in file /tmp/p2
wget -q -O /tmp/p2 "http://ursule/test/test.php?p=2&w=2"
PID_2=$!
# Wait for the two processes to terminate before displaying the result
wait $PID_1 && wait $PID_2 && cat /tmp/p1 /tmp/p2
test.phpスクリプトは単純です。
<?php
printf('Process %s (sleep %s) started at %s ', $_GET['p'], $_GET['w'], date("H:i:s"));
sleep($_GET['w']);
printf('finished at %s', date("H:i:s"));
?>
bashスクリプトは次を返します。
$ ./multiThread.sh
Process 1 (sleep 5) started at 15:12:59 finished at 15:12:04
Process 2 (sleep 2) started at 15:12:59 finished at 15:12:01
私がこれまでPython3で試したこと:
#!/usr/bin/python3.2
import urllib.request, threading
def wget (address):
url = urllib.request.urlopen(address)
mybytes = url.read()
mystr = mybytes.decode("latin_1")
print(mystr)
url.close()
thread1 = threading.Thread(None, wget, None, ("http://ursule/test/test.php?p=1&w=5",))
thread2 = threading.Thread(None, wget, None, ("http://ursule/test/test.php?p=1&w=2",))
thread1.run()
thread2.run()
これは、次のように期待どおりに機能しません。
$ ./c.py
Process 1 (sleep 5) started at 15:12:58 finished at 15:13:03
Process 1 (sleep 2) started at 15:13:03 finished at 15:13:05