使用状況やデーモンプロセスのいくつかの

使用状況やデーモンプロセスのいくつかの

参加用法の、プロセス

いくつかの単語の男は、コードに直接、言いました

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()

# 为了保证数据的安全,要牺牲掉效率

おすすめ

転載: www.cnblogs.com/zhuangyl23/p/11515426.html