ディレクトリ
使用状況やデーモンプロセスのいくつかの
参加用法の、プロセス
いくつかの単語の男は、コードに直接、言いました
join 用法一 ,单进程
from multiprocessing import Process
import time
def foo():
print('子进程 start')
time.sleep(2)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.start()
# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
p.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
print('主进程')
# join用法二(并发)
from multiprocessing import Process
import time
def foo(x):
print('子进程 start')
time.sleep(x)
print('子进程 end')
if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start()
p2.start()
p3.start() # 这几个相当于并发
# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
p1.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
p2.join()
p3.join()
# 总时长:按照最长的时间计算多一点
end = time.time()
print(end-start)
print('主进程')
# join用法三(串行)
from multiprocessing import Process
import time
def foo(x):
print('子进程 start')
time.sleep(x)
print('子进程 end')
if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start()
p1.join() # 在这阻塞住,主进程等待该子进程结束,然后再往下执行,(了解:内部会调用wait())
p2.start()
p2.join()
p3.start() # 这几个相当于并行
p3.join()
# 核心需求就是想让子进程执行完,再执行主进程的print,time有弊端
# time.sleep(5)
# 总时长:按照最长的时间计算多一点
end = time.time()
print(end-start)
print('主进程')
# 优化join用法二
from multiprocessing import Process
import time
def foo(x):
print(f'子进程{x} start')
time.sleep(x)
print(f'子进程{x} end')
if __name__ == '__main__':
start = time.time()
p_list = []
for i in range(1,4):
p = Process(target=foo, args=(i,))
p.start()
p_list.append(p)
for p in p_list:
p.join()
end = time.time()
print(end-start)
print('主进程')
二、プロセスとPIDのPPIDの使用状況
私たちは、モジュールのOSをインポートする必要があります
現在のプロセスの視点に立ち:os.getpid()>>>>現在のプロセスのPIDを取得
os.getppid()PID >>>>親プロセスの現在のプロセスを取得します。
子オブジェクトは、子プロセスが現在のプロセスをのpidを取得>>>>を.pid
具体的に以下のコードを見て
from multiprocessing import Process,current_process
import time,os
def task():
print('子进程 start')
print('在子进程中查看自己的pid',current_process().pid) # 在子进程查看自己pid方法一
print('在子进程中查看自己的pid',os.getpid()) # 在子进程查看自己pid方法二
print('在子进程中查看父进程的pid',os.getppid())
time.sleep(2)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=task)
p.start()
print('在主进程查看子进程的pid',p.pid) # 获取pid,一定要写在start()之后
print('主进程的pid',os.getpid())
print('主进程的父进程pid',os.getppid())
print('主进程')
メインプロセスでは子プロセスpid 1928を参照すること
の主なプロセスのpid 2900を
メインプロセスpid 1008の親プロセス
主要プロセスの
子プロセスが開始
子自身のpid 1928年に見て
、子供自身のpid 1928年に見て
、子供に親を見て2900 PIDプロセスの
子プロセスの終了
三、名前の使用のプロセス
これは、プロセス名を表示するために使用されます
from multiprocessing import Process,current_process
import time
def foo():
print('子进程 start')
print('>>>>',current_process().name) # 获取当前进程名
time.sleep(2)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.start()
print(p.name)
プロセス1
のサブプロセスの開始
プロセス-1
サブプロセスの終わり
四、プロセスのis_alive使用
プロセスが生きているかどうかを判断するために使用し、結果はTrueまたはFalseです
from multiprocessing import Process,current_process
import time
def foo():
print('子进程 start')
time.sleep(2)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.start()
print(p.is_alive()) # 没运行完就活着 True
time.sleep(5)
print(p.is_alive()) # 代码运行完了就算死了 False
print('主进程')
真の
子プロセスが開始され
たサブプロセスが終了
Falseの
主要プロセスを
五、プロセスの使用を終了します
直接終了するために使用されるプロセス(ダイ)
from multiprocessing import Process,current_process
import time
def foo():
print('子进程 start')
time.sleep(50)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.start()
p.terminate() # 给操作系统发了一个终止进程的请求
print(p.is_alive()) # 没运行完就活着 True
p.join() # 可以不等50秒,直接执行下面的
print(p.is_alive())
print('主进程')
真
偽
主要プロセス
第六に、デーモン
デーモン性質は、サブコード処理であり、メイン処理が終了し、デーモンを直接終了します
from multiprocessing import Process
import time
def foo():
print('守护进程 start')
time.sleep(10)
print('守护进程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.daemon = True # 把这个子进程定义为了守护进程,只陪伴到打印主进程就结束
p.start()
print('主进程') # 这个执行完,主进程的代码就执行完毕,子进程就直接结束,
プライマリプロセス
七、グラブ票アプレット
from multiprocessing import Process
import json,time,os
def search():
time.sleep(1)
with open('db',mode='rt',encoding='utf-8') as fr:
res = json.load(fr)
print(f'还剩{res["count"]}张')
def get():
with open('db',mode='rt',encoding='utf-8') as fr:
res = json.load(fr)
time.sleep(1) # 模拟网络io
if res['count'] > 0:
res['count'] -= 1
with open('db',mode='wt',encoding='utf-8') as fw:
json.dump(res,fw)
time.sleep(1.5) # 模拟网络io
print(f'进程{os.getpid()}抢票成功')
else:
print('票已售罄!!!')
def task():
search()
get()
if __name__ == '__main__':
for i in range(15):
p = Process(target=task)
p.start()
p.join()
# 为了保证数据的安全,要牺牲掉效率