マルチパッケージプロセスモジュールのマルチプロセスを作成します。


マルチパッケージプロセスモジュールのマルチプロセスを作成します。


1.processモジュールは、作成のモジュール工程であります

Process([group [, target [, name [, args [, kwargs]]]]]) クラスのオブジェクトは、サブプロセスのタスクを示す、インスタンス化します

彼は強調しました

  1. あなたは、パラメータを指定するキーワードの方法を使用する必要があります
  2. 伝達関数パラメータの目標位置を指定した引数は、タプルの形態である、コンマが存在しなければなりません

パラメータ説明

  • グループパラメータが使用されていない、値は常にNoneです
  • ターゲットは、タスクをあるコールターゲットは、子プロセスが実行されることを示しています
  • 引数パラメータは、オブジェクトを呼び出すタプルの位置を示し、args=(1,2,'cxk',)
  • kwargsからは、コール・オブジェクトディクショナリことを示していますkwargs={'name':'cxk','age':98}
  • 名前は、子プロセスの名前です。

メソッドの紹介

  • p.start():)(プロセスを起動し、子プロセスのp.runを呼び出します
  • p.run():操作の方法、処理が開始されると、それは指定されたターゲットを呼び出すための関数である、我々この方法でのカスタムクラスが達成されなければなりません
  • p.terminate():P pは、子プロセスを作成した場合、子プロセスがゾンビプロセスになるために、任意の清掃作業を行わないであろう、プロセスを強制終了する、この方法は、このような状況を、特別な注意が必要です。pが、その後も、保存した場合はロックがデッドロックにつながる、解放されることはありません
  • p.is_alive():pがまだ実行されているとTrueを返すされている場合
  • p.join([timeout]):Pメインスレッドが終了するのを待つ(ストレス:状態は、他のメインスレッドであり、そしてpは動作状態にあります)。タイムアウトは、タイムアウトがp.joinが開いてプロセスを開始し、ライブ実行オープンなプロセスに参加することはできませんライブに参加することができ、ことを強調しなければならないオプションです。

はじめプロパティ

  • p.daemon:Trueに設定されている場合、デフォルト値は、Falseで、Pの代表は、親プロセスpの終了が、またpは終了するバックグラウンドでデーモンを実行であり、真の設定した後、pは、独自の新しいプロセスを作成することはできません必要がありますでp.start()設定する前に
  • p.nameプロセスの名称:
  • p.pid:PIDプロセス
  • p.exitcode:ランタイムなしの処理は、-N場合、(理解する)信号の終了を表すN
  • p.authkey:によってアイデンティティの検証プロセスのキーは、デフォルトのos.urandom()32文字のランダムに生成された文字列。キーの目的は、通信に関わる根本的なプロセス間のネットワーク接続のセキュリティを提供するものである場合にのみ、同じ認証キーを使用して、(理解する)このタイプの接続を成功するには

Windowsでプロセス・モジュールの使用を注意してください

何のフォーク(Linuxオペレーティングシステムのためのメカニズムを作成するプロセス)がないので、子プロセスを作成するときに、Windowsのオペレーティングシステムでは、自動的にそれを起動するには、このファイルをインポートしますが、彼らは、ファイル全体のインポートで実行するとき。だから、直接ファイルに記述された場合、プロセスは、()子プロセス無限再帰エラーを作成します。一部使用の子プロセスを作成する必要がありif __name__ =='__main__'、保護されたかを決定するためにインポート時、それは再帰的に実行されません。

import time
from multiprocessing import Process

def func(name):
    print('hello',name)
    time.sleep(2)
    print('我是子进程')

if __name__ == '__main__':
    p = Process(target=func,args=('usb',))
    p.start()    # 启动进程,并调用该子进程中的p.run()后开始运行,告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,
                    # 具体操作系统什么时候开子,开多长时间跟你没关系。
    # time.sleep(3)
    print('执行主进程的内容')

子プロセスをオープンカンタービレ?

一つの方法:

from multiprocessing import Process
import time

def task(x):
    print(f'子进程{x} start')
    time.sleep(2)
    print(f'子进程{x} end')


if __name__ == '__main__':
    p = Process(target=task,args=('cxk',))
    p2 = Process(target=task,args=('nike',))
    p.start()  # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子,开多长时间跟你没关系。
    p2.start()
    time.sleep(4)
    print('我是父进程')

第二の方法:(推奨されません)

from  multiprocessing import Process
import time

class Tset(Process):
    def __init__(self,gender):
        super().__init__()
        self.gender = gender

    def run(self):
        print(f'子进程是{self.gender} start')
        time.sleep(2)
        print('子进程 end')

if __name__ == '__main__':
    p = Tset('基佬')
    p.start()  # 向操作系统 发送开启子进程的请求
    # time.sleep(3)
    print('我是主进程')

メモリデータの分離の検証プロセス

from multiprocessing import Process
import time

x=0
def task():
    global x
    x= 100
    print('子进程的x修改为了{}'.format(x))

if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    time.sleep(5)
    print(x)

参加プロセスモジュールは、次を使用します。

p.join([timeout]):Pメインスレッドが終了するのを待つ(ストレス:状態は、他のメインスレッドであり、そしてpは動作状態にあります)。タイムアウトは、タイムアウトがp.joinが開いてプロセスを開始し、ライブ実行オープンなプロセスに参加することはできませんライブに参加することができ、ことを強調しなければならないオプションです。

この方法の一つ:

from multiprocessing import Process
import time

def foo():
    print('进程 start')
    time.sleep(3)
    print('进程 end')

if __name__ == '__main__':
    p = Process(target=foo)
    p.start()
    p.join()
    print('我是主进程')

方法2:

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

    p1.join()
    p2.join()
    p3.join()
    end = time.time()  # 计算三个子进程的运行时间
    print(end-start)   # 3.83371901512146
    print('我是主进程')

モード3:

from multiprocessing import Process
import time

def foo(x):
    print(f'进程{x} start')
    time.sleep(x)
    print(f'进程{x} 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()

    p2.start()
    p2.join()

    p3.start()
    p3.join()

    # 不如不开,直接穿行调用函数反而快
    # foo(1)
    # foo(2)
    # foo(3)

    end = time.time()
    print(end-start) # 7.275144100189209
    print('我是主进程')

4:(コード最適化手法II)

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)
    print(p_list)
    for p in p_list:
        p.join()
    end = time.time()   
    print(end-start)  # 3.721641778945923
    print('我是主进程')

PIDと使用のPPID:

from  multiprocessing import Process,current_process
import time,os


def func():

    print('子进程 start')
    print('在子进程中查看自己的Pid',current_process().pid)
    print('在子进程中查看父进程的pid',os.getpid())
    time.sleep(200)
    print('子进程 end')

if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    print('在主进程查看子进程的pid',p.pid) # 一定要写在 start() 之后
    print('主进程的pid:',os.getpid())
    print('主进程的父进程pid:',os.getppid())
    print('我是主进程')

**これを把握することで、OKを覚えて
、現在のプロセスの視点でスタンドを
os.getpid()#現在のプロセスの取得
pidos.getppid()#は、現在のプロセスの親プロセスpidゲット
オブジェクトを取得するために、子プロセスを#を.PID子プロセスは、現在のプロセスのpidを


名前とis_alive使い方(理解)

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)
    p2 = Process(target=foo)
    p3 = Process(target=foo,name='cxk')  # 自定义进程

    p.start()
    p2.start()
    p3.start()
    print(p.is_alive())  # True
    time.sleep(5)
    print(p.is_alive())  # 代码运行完了就算该进程已经结束了(死了)False
    print(p.name)
    print(p2.name)
    print(p3.name)
    print('我是主函数')

の使用を終了します。

p.terminate():P pは、子プロセスを作成した場合、子プロセスがゾンビプロセスになるために、任意の清掃作業を行わないであろう、プロセスを強制終了する、この方法は、このような状況を、特別な注意が必要です。pが、その後も、保存した場合はロックがデッドロックにつながる、解放されることはありません

from  multiprocessing import 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  系统还没处理到终止请求 ,所以为True
    p.join()
    print(p.is_alive())  # False
    print('我是主进程')

デーモン:

ガーディアン - 「付き

自然は子プロセスであります

主要プロセスのコードでは、デーモンが終了し終了します。しかし、この時間は、メインプロセスは終わってないかもしれません。「」 '

from multiprocessing import Process
import time

def foo():
    print('守护进程 start')
    time.sleep(5)
    print('守护进程 end')

if __name__ == '__main__':
    p = Process(target=foo)
    p.daemon = True  # 把这个子进程定义为守护进程
    p.start()
    time.sleep(2)
    print('我是主进程')

デーモン2:

from multiprocessing import Process
import time

def foo():
    print('守护进程 start')
    time.sleep(3)
    print('守护进程 end')

def func():
    print('子进程 start')
    time.sleep(5)
    print('子进程 end')

if __name__ == '__main__':
    p = Process(target=foo)
    p2 = Process(target=func)
    p.daemon = True  # 把这个子进程定义为守护进程
    p.start()
    p2.start()
    time.sleep(1)
    print('我是主进程')

演習:グラブ投票アプレット:

from  multiprocessing import Process
import json,time,os

def search():
    time.sleep(1)  # 模拟网络io
    with open('db.txt',mode='rt',encoding='utf-8') as fr:
        res = json.load(fr)
        print(f'还剩{res["count"]}张票')


def get():
    with open('db.txt',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.txt',mode='wt',encoding='utf-8') as fw:
            json.dump(res,fw)
            print(f'进程{os.getpid()} 抢票成功')
        time.sleep(1.5)  # 模拟网络io

    else:
        print('票已售罄!!!')

def task():
    search()
    get()

if __name__ == '__main__':
    for i in range(10):
        p = Process(target=task)
        p.start()
        p.join()

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

おすすめ

転載: www.cnblogs.com/guapitomjoy/p/11515567.html