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集約型:(マルチスレッド)
ネットワークダウンロード、ネットワーク待機、ファイル操作