マルチプロセスに関連するコンテンツ(IPC)

マルチプロセス関連コンテンツ

1.デーモン(デーモン)

マスターデーモン・プロセスを作成します。1.デーモンは、メインプロセスのコード実行の終了後に終了します

デーモン内の2は、もはやそうでない場合は例外がスローされ、子プロセスを回すことはできません

注:プロセス間で互いに独立している、メイン処理コードの終わり、デーモンランダム終了

from multiprocessing import Process

def task():
    print('son is running')

    print('son is done')

if __name__ == '__main__':
    p = Process(target = task)
    p.daemon = True     #要在p.start()前设置,设置p为守护进程
    p.start()

    print('father process')

2.プロセス同期

互いに分離プロセス間のメモリのマルチチャンネル物理的側面の技術的要件に、すなわち、データを共有することができないが、我々は、同じファイルシステムの集合なので、同じファイルへのアクセスを共有したり、問題なく同じ端末を印刷することができます。

シリアルなっ同時、作業効率を犠牲にしますが、ハードウェアリソースを回避:データ化けが生じ異なる速度で作成プロセスが、共有ファイルや印刷の混乱が生成されますので、私たちは、ロックをロックの概念が導入されました競争とデータのセキュリティを確保します。

1.ロック

#模拟抢票
#json中存放字典的key格式必须以双引号注明
from multiprocessing import Process,Lock
import json

#查询余票信息
def search():
    with open('db.json') as f:
        data = json.load(f)
        print('剩余票数:',data['count'])

#购买
def buy():

    #由于网络延时,需重新获取余票信息
    with open('db.json') as f:
        data = json.load(f)

        if data['count']>0:
            data['count'] -= 1
            with open('db.json','wt') as fw:
                json.dump(data,fw)
                print('抢票成功')

def task(mutex):
    search()
    
    mutex.acquire() #加锁
    buy()
    mutex.release() #解锁
    
if __name__ == '__main__':
    mutex = Lock()  #创建锁
    
    for i in range(5):
        p = Process(target=task,args=(mutex,))
        p.start()

#加锁:保证多个进程修改同一块数据,同一时间只能有一个任务可以进行修改即串行的修改
#适用于:   1.共享数据较大,效率低
#         2.需要人为加锁

3. IPC通信機構(推奨)ベースのマルチプロセッシングモジュール

IPC:interface_process_communication(プロセス間通信)、マルチプロセッシングモジュールには2つの形式をサポート:キューとパイプラインは、これらの2つの方法が使用されます。

マネージャの使用

from multiprocessing import Process,Manager,Lock


def task(data,lock):
    lock.acquire()
    num = data[0]
    data[0] = num - 1
    lock.release()

    print('son is done')


if __name__ == '__main__':
    ls = [100]
    m = Manager()           #创建管理器
    syncls = m.list(ls)     #同步列表

    lock = Lock()

    ps = []
    for i in range(10):
        p = Process(target=task,args=(syncls,lock))
        p.start()
        ps.append(p)

    for p in ps:p.join()

    print(ls)       #100
    print(syncls)   #90

パイプライン・データ・キューはメモリに格納されている(すなわち、実行時にメモリに格納された共通データの開口面積)

#队列原则:先进先出
from multiprocessing import Queue

q = Queue(5)    #创建队列中,同时只能存在最多元素maxsize=5
q.put(1)        #放入元素
q.put(1,block=True,timeout=1) #block阻塞,默认为true,timeout延时(当队列为空时,在该时间内放入元素

print(q.get(1) )   #取出队列元素


#栈,函数调用,原则:后进先出
def a():
    b()


def b():
    c()


def c():
    print('c')
    raise  Exception


a()

おすすめ

転載: www.cnblogs.com/bruce123/p/11184402.html