python学習ノートの多くのプロセス


私たちの現代のオペレーティングシステムは、「マルチタスク」をサポートするオペレーティングシステムです。オペレーティングシステムにとって、一つのミッションはプロセスです。例えばブラウザを開くとブラウザのプロセスが起動します。
計算機の核心CPUを工場にたとえると、プロセスは工場内の作業場のようになり、CPUが処理できる単一の任務を表します。いつでもCPUはプロセスを実行し、他のプロセスは非実行状態にある。
これを見て疑問に思うかもしれませんが、他のプロセスは非実行状態ですか?しかし、私がブラウザでウェブページを訪問した時、音楽プレーヤーも運行していたのに。
実際にはオペレーティングシステムが交替で各タスクを実行させ、タスク1が0.01秒を実行し、タスク2が0.01秒を実行し、タスク3に切り替えて、0.01秒を実行します。表面的には、各タスクは交互に実行されますが、CPUの実行速度は速すぎますので、すべてのタスクが同時に実行されているような気がします。
Pythonのプロセス
UNIX/LINUXオペレーティングシステムでは、fork()関数を使って作成できます。fork関数は他の普通関数に比べてちょっと特殊なところがあります。普通の関数の呼び出しで、一回呼び出して、一回返します。しかし、fork()は一回呼び出して、二回戻ります。オペレーティングシステムは自動的に現在のプロセス(親プロセスと呼ぶ)を一部コピーして、それぞれ親プロセスと子プロセスの中で戻ります。
子プロセスは常に0に戻り、親プロセスは子プロセスのIDに戻る。このようにした理由は、親プロセスがforkして多くの子供プロセスを作ることができるため、親プロセスは各子プロセスのIDを記録し、子プロセスはgetppid()を呼び出すだけで親プロセスのIDを取得することができるからです。
fork()関数はosモジュールに実装されます。次に、多プロセスの使用と多プロセスの使用の違いを例に挙げて説明する。

from random import randint

from time import time, sleep

def download_task(filename):

print('    %s...' % filename)

time_to_download = randint(5, 10)

sleep(time_to_download)

print('%s    !    %d ' % (filename, time_to_download))

def main():

start = time()

download_task('MySQL      .pdf')

download_task('     .mp4')

end = time()

print('     %.2f .' % (end - start))if __name__ == '__main__':

main()
実行結果:
MySQLをダウンロードし始めました。削除ライブラリから逃げ道まで。pdf…
MySQLは骨抜きから逃げ道まで.pdfダウンロードが完了しました。9秒を費やしました
ダウンロードを開始するとは思いませんでした。mp 4…
まさか.mp 4ダウンロードが完了しました。9秒を費やしました
全部で18.00秒かかりました。
上記の例から分かるように、プログラムのコードが少しずつ下に行くしかないなら、二つの無関係のダウンロードタスクを実行しても、一つのファイルをダウンロードしてから次のダウンロードジョブが開始されるのを待つ必要があります。次に、私たちはマルチプロセスを使用して、二つのダウンロードタスクを異なるプロセスに配置します。コードは下記の通りです。

from multiprocessing import Process

from os import getpid

from random import randint

from time import time, sleep

def download_task(filename):

print('      ,   [%d].' % getpid()) print('    %s...' % filename) time_to_download = randint(5, 10)

sleep(time_to_download)

print('%s    !    %d ' % (filename, time_to_download))

def main():

start = time()

p1 = Process(target=download_task, args=('MySQL      .pdf', ))

p1.start()

p2 = Process(target=download_task, args=('     .mp4', ))

p2.start()

p1.join()

p2.join()

end = time()

print('     %.2f .' % (end - start))

if __name__ == '__main__': main()
実行結果:
ダウンロードプロセスを開始します。プロセス番号は[568408]です。
ダウンロードを開始するとは思いませんでした。
mp 4ダウンロード完了6秒を費やしました
ダウンロードプロセスを開始します。プロセス番号は[565896]。
MySQLをダウンロードし始めました。
pdf...MySQLは削除ライブラリから逃げ道まで.pdfダウンロードが完了しました。10秒を費やしました
全部で10.09秒かかりました。
上のコードを実行すると、2つのダウンロードジョブが「同時に」起動され、プログラムの実行時間が大幅に短縮され、2つのタスクの時間の合計ではないことが明らかになります。
以上はpython学習ノートのプロセスの詳細です。Pythonプロセスに関する資料は他の関連記事に注目してください。