Pythonマルチプロセスデーモン
愛、憎しみ、憎しみの苦しみを理解していない私たちの人々は、愛の死はただの古代の噂だといつも思っています。
1. 1つのプロセスのみが存在し、プロセスはデーモンの子プロセスです
。この時点で、子プロセスはメインプロセスを保護しており、メインプロセスが終了する限り、子プロセスは終了します。
from multiprocessing import Process
import time
def task(name):
print(f"{name} is running")
time.sleep(2)
print(f"{name} is gone")
if __name__ == "__main__":
p = Process(target=task,args=("常辛",)) # 创建一个进程对象
p.start()
p.daemon = True # 一定要在子进程开启之前设置
print("主进程")
这里设置在了子进程开始之前,所以执行结果报错:
assert self._popen is None, 'process has already started'
AssertionError: process has already started
常辛 is running
常辛 is gone
p.startの前にp.daemon = Trueを置き、見てみましょう。
from multiprocessing import Process
import time
def task(name):
print(f"{name} is running")
time.sleep(2)
print(f"{name} is gone")
if __name__ == "__main__":
p = Process(target=task,args=("常辛",)) # 创建一个进程对象
p.daemon = True # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束
p.start()
print("主进程")
主进程
メインプロセスが実行された後、子プロセスが実行されていないことがわかります(時間が遅すぎるため、1文でも)。
メインプロセスの終了時間を延期して、次のことを確認しましょう。
from multiprocessing import Process
import time
def task(name):
print(f"{name} is running")
time.sleep(2)
print(f"{name} is gone")
if __name__ == "__main__":
p = Process(target=task,args=("常辛",)) # 创建一个进程对象
p.daemon = True # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束
p.start()
time.sleep(1)
print("主进程")
常辛 is running
主进程
次に、プログラムは子プロセスの最初のコードを正常に実行しました。
2.プロセスにはデーモンだけでなく、非デーモンもあります。
from multiprocessing import Process
import time
def task():
print(123)
time.sleep(1)
print(f"end123")
def task1():
print(456)
time.sleep(3)
print(f"end456")
def task2():
print(789)
time.sleep(5)
print(f"end789")
if __name__ == "__main__":
p1 = Process(target=task) # 创建一个进程对象
p2 = Process(target=task1) # 创建一个进程对象
p3 = Process(target=task2) # 创建一个进程对象
p2.daemon = True # 将p2子进程设置成守护进程,只要主进程结束,守护进程马上结束
p1.start()
p2.start()
p3.start()
# time.sleep(1)
print("主进程")
主进程
123
789
end123
end789
メインプロセスの実行後に子プロセスp2が実行されていないことがわかりますが(時間が遅すぎると言われています)、なぜp1とp3がまだ実行されているのでしょうか。
理由は次のとおりです。p1とp3はどちらも子プロセスであるため、メモリスペースを開く必要があり、時間がかかります。p2はデーモンの子プロセスであり、p1とp3は非デーモンであるため、メインプロセスが最初に出力されます。子プロセス、メインプロセスが実行されると(メインプロセスは終了していません。p1とp3の非デーモンプロセスがあるため)、p2デーモンプロセスはなくなりますが、p1とp3の非デーモンプロセスがあるためです。 p1とp3が実行されると、p1とp3は独自のコードタスクを実行します。その後、メインプロセスが終了し、プログラム全体が終了します。
引き続き確認する前に、メインプロセスの終了時間を延期しましょう。
from multiprocessing import Process
import time
def task():
print(123)
time.sleep(1)
print(f"end123")
def task1():
print(456)
time.sleep(3)
print(f"end456")
def task2():
print(789)
time.sleep(5)
print(f"end789")
if __name__ == "__main__":
p1 = Process(target=task) # 创建一个进程对象
p2 = Process(target=task1) # 创建一个进程对象
p3 = Process(target=task2) # 创建一个进程对象
p2.daemon = True # 将p2子进程设置成守护进程,只要主进程结束,守护进程马上结束
p1.start()
p2.start()
p3.start()
time.sleep(1)
print("主进程")
123
456
789
主进程
end123
end789
プログラムは子プロセスp2の最初のコードを正常に実行し、メインプロセスのコードが終了した後、p2も終了します。2つの非デーモン子プロセスp1とp3の終了を待つと、プロセスは次のように見なされます。完全な終わり。
Pythonマルチスレッドデーモン
マルチスレッドデーモンは、マルチプロセスと同じ方法で記述され、すべて開始前に配置されます。
スレッドは非常に高速に開始されるため(メインスレッドよりも高速です。これは誰もが見ることができる例です:)
from threading import Thread
def sayhi(name):
print(111)
print("%s say hello" % name)
if __name__ == "__main__":
t = Thread(target=sayhi,args=("egon",))
t.start() # 线程的开启速度比进程的要快很多
print("主线程")
111
egon say hello
主线程
最初にスレッドのコンテンツを実行し、次にそれを実行するメインスレッドを見ることができます。
ホームに近いデーモンスレッドでは、メインスレッドが終了すると子スレッドも終了します。これについては、以下で説明します。
1.スレッドは1つだけ存在し、このスレッドはデーモンの子スレッドです。
from threading import Thread
import time
def sayhi(name):
print(111)
time.sleep(2)
print("%s say hello" % name)
if __name__ == "__main__":
t = Thread(target=sayhi,args=("egon",))
t.setDaemon(True) # 必须在t.start()之前设置
# t.daemon = True
t.start() # 线程的开启速度比进程的要快很多
print("主线程")
111
主线程
メインスレッドが終了すると、子スレッドはまだスリープを待機しているため、メインスレッドが実行されるのに十分な時間があり、メインプロセスが終了します。プログラムが終了し、子スレッドが終了します。
ここで注意してください:t.setDaemon(True)とt.daemon = Trueは両方ともデーモンスレッド用に書かれています(どちらも使用できます)
2.スレッドには、デーモンスレッドだけでなく、非デーモンスレッドもあります。
from threading import Thread
import time
def foo():
print(123)
time.sleep(2)
print("end123")
def foo1():
print(456)
time.sleep(1)
print("end456")
def foo2():
print(789)
time.sleep(1)
print("end789")
if __name__ == "__main__":
t1 = Thread(target=foo)
t2 = Thread(target=foo1)
t3 = Thread(target=foo2)
t1.daemon = True
t1.start()
t2.start()
t3.start()
# time.sleep(3)
print("主线程")
123
456
789
主线程
end456
end789
結果から、プログラムの実行後、3つの子スレッドt1、t2、t3が最初にprintの最初の文を実行し、次にスリープを待っている間にメインスレッドを実行することがわかります。t1はデーモンプロセスであるため、メインスレッドコードが終了すると、t1サブスレッドが終了し、t2とt3は非デーモンスレッドになります。ただし、メインスレッドのコードはこことメインスレッドの実行後に実行されます。スレッドですが、メインスレッドの場合、実行の完了とは、メインスレッドが実行されているプロセス内のすべての非デーモンスレッドが完了し、メインスレッドが実行を終了したと見なされることを意味します。したがって、スリープ後のコードはt2とt3が実行されます。
概要:メインスレッドはいつ終了しますか?(このコードは印刷されません(「メインスレッド」)が終了しますが、スレッド全体)
デーモンスレッド、非デーモン子スレッド、および(メインスレッドのコード)が終了した後に終了します。
この記事がお役に立てば幸いです。よく書かれた記事が著者に励ましを与えることができると思います〜あなたのサポートは私の前進へのモチベーションです!