python self-study-class23(up)-pythonプロセスの基本的な学習

Pythonプロセスの基本的な学習

Linuxプロセス

Linuxもインストールされていますが、私はLinuxに精通していません。Linux環境のPythonプロセスには、次の数行のコードしかありません。

import subprocess
pingP=subprocess.Popen(args=["data"],shell=True)  #执行Linux指令,打开外部程序
pingP.wait()
print(pingP.Pid) #打印编号
print(pingP.returncode)  #打印返回值

Windowsプロセス

1.マルチプロセッシング
2.結合
3.ロック
4.共有
5.パイプ
6.キュー
7.キュープラス
8.プロセスデータ共有
9.プロセス共有配列
10.プロセス共有リストとdict

++++++++++++ +++++++++++++++++++++++++++++
1.マルチプロセッシング
はmultiprocessing.Process(target = info、args =( "Xiaoming"、))を使用しますプロセスを作成します。targetはメソッド、argsはパラメーターです。

import os
import multiprocessing
def info(title):
    print(title)
    print(__name__)
    print("father ppid",os.getppid())
    print("self pid",os.getpid())
    print("-------")

if __name__=="__main__":
    info("hello")
    #多进程,创建进程
    p=multiprocessing.Process(target=info,args=("小明",))
    p.start()
    #p.join()  #join父亲进程必须等待子线程干完活才能执行后续代码
    print("在哪儿")

2.join
はjoinを使用して、プロセスを順番に機能させます。これはスレッドと同様です。

import os
import multiprocessing
import time
def info(title):
    print(title)
    time.sleep(2)
    print(__name__)
    print("father ppid",os.getppid())
    print("self pid",os.getpid())
    print("-------")

if __name__=="__main__":
    p1=multiprocessing.Process(target=info,args=("A",))
    p2=multiprocessing.Process(target=info,args=("B",))
    p3=multiprocessing.Process(target=info,args=("C",))
    #进程并发干活
    p1.start()
    p2.start()
    p3.start()
    print("over")
    '''
        #join使进程轮流干活
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    '''

3.ロック
#マルチプロセス、同時、順不同の同時実行
#マルチプロセスロックは1つずつ実行できますが、それでも順不同です

import os
import multiprocessing
import time
#多进程,并发,乱序并发执行
#多进程加锁可以挨个执行,但是还是乱序
def showdata(lock,i):
    with lock:
        time.sleep(2)
        print(i)

if __name__=="__main__":
    lock=multiprocessing.RLock()#创建锁
    for num in range(10):
        multiprocessing.Process(target=showdata,args=(lock,num)).start()

4.
共有プロセスの共有では、グローバル変数を定義してから、グローバルを使用してグローバル変数を呼び出す必要があります

import multiprocessing
import time
import os

datalist=[]#全局变量
def adddata():   #子进程
    global datalist #引用全局变量
    datalist.append(1)
    datalist.append(2)
    datalist.append(3)
    print(os.getpid(),datalist)

if __name__=="__main__":  #主进程
    p=multiprocessing.Process(target=adddata,args=())
    p.start()
    datalist.append("a")
    datalist.append("b")
    datalist.append("c")
    print(os.getpid(),datalist)

5.
パイプパイプラインモード、1つのパイプに2つのポート、1つは入力、もう1つは出力

#a,b=(1,2)
#print(a,b)
import multiprocessing
import os
def func(conn):  #conn是管道类型
    conn.send(["a","b","c","d","e"]) #发送数据
    print(os.getpid(),conn.recv()) #收到数据
    conn.close()

if __name__=="__main__":
    conn_a,conn_b=multiprocessing.Pipe() #创建一个管道,俩个口
    #print(id(conn_a),id(conn_b))
    #print(type(conn_a),type(conn_b))
    p=multiprocessing.Process(target=func,args=(conn_a,))
    p.start()
    conn_b.send([1,2,3,4,5,6,7])
    print(os.getpid(),conn_b.recv())
    p.join()

6.キュー
キューは共有できますが、一方向の通信のみ
#親プロセスの挿入、子プロセスの読み取り
#子プロセスの書き込み、親プロセスの読み取り

import multiprocessing
queue=multiprocessing.Queue()  #队列可以实现共享

def func(myq):
    print(id(myq))   #子进程读取
    #myq.put([1,2,3,4,5])  #子进程插入
    print(myq.get())

if __name__=="__main__":
    print(id(queue))
    queue.put([1,2,3,4,5,6])#父进程插入
    p=multiprocessing.Process(target=func,args=(queue,))
    p.start()
    #print("futher",queue.get())  #父进程取出

7.queueplus

import multiprocessing
import os
queue=multiprocessing.Queue()  #队列可以实现共享

def adddata(queue,i):
    queue.put(i)
    print("put",os.getppid(),os.getpid(),i)

if __name__=="__main__":
    mylist=[]
    for i in range(10):
        p=multiprocessing.Process(target=adddata,args=(queue,i))
        p.start()
        #print(queue.get())
        mylist.append(queue.get())
    print(mylist)

8.プロセスデータ共有
multiprocessing.Value( "d"、0.0)を使用して、複数のプロセス間のデータ共有を実現します

import multiprocessing
def func(num):
    num.value=10.9
if __name__=="__main__":
    num=multiprocessing.Value("d",0.0) #d数据,多个进程之间共享
    print(num.value)
    p=multiprocessing.Process(target=func,args=(num,))
    p.start()
    p.join()
    print(num.value)

9.プロセス間で配列を共有
するmultiprocessing.Array( "i"、[1,2,3,4,5])を使用して、複数のプロセス間で配列を共有します。

import multiprocessing
def func(num):
    num[3]=10
if __name__=="__main__":
    num=multiprocessing.Array("i",[1,2,3,4,5]) #i代表int
    print(num[:])
    p=multiprocessing.Process(target=func,args=(num,))
    p.start()  #进程之间数据共享
    p.join()
    print(num[:])

10.プロセス間でのリストとdictの共有は
、multiprocessing.Manager()を使用して実装されます。

import multiprocessing
def func(mydict,mylist):
    mydict["txm"]="love sleep"
    mydict["tmy"]="love study"
    mylist.append(11)
    mylist.append(22)
    mylist.append(33)

if __name__=="__main__":
    with multiprocessing.Manager() as MG:
        mydict=MG.dict()
        mylist=MG.list(range(5))

        p=multiprocessing.Process(target=func,args=(mydict,mylist))
        p.start()
        p.join()
        print(mylist)
        print(mydict)

総括する

Pythonのマルチスレッドは、疑似マルチスレッドです。たとえば、特定の操作を実行する場合は0.001秒、特定の操作を実行する場合は0.002秒です。、本当の意味での同時実行ではありません。
したがって、チェックを待機しているネットワークなどのイベントにはマルチスレッドを使用でき、計算量の多いイベントにはマルチプロセス
CPUを集中的に使用する必要があります:(マルチプロセスは実際の同時実行です)
コンピューティング、深層学習トレーニング、科学コンピューティング、データの取得
メモリ内のIO集約型:(マルチスレッド)
ネットワークダウンロード、ネットワーク待機、ファイル操作

おすすめ

転載: blog.csdn.net/weixin_46837674/article/details/113828053