pythonでのマルチスレッドは、実際にはマルチスレッドではありません。マルチコアCPUリソースを最大限に活用する場合、ほとんどの場合、pythonでは複数のプロセスを使用する必要があります。 Pythonは、非常に便利なマルチプロセスパッケージMultiprocessingを提供します。関数を定義するだけで、Pythonが他のすべてを実行します。このパッケージを使用すると、単一プロセスから同時実行への変換を簡単に完了することができます。マルチプロセッシングは、サブプロセス、通信、およびデータの共有をサポートし、さまざまな形式の同期を実行し、プロセス、キュー、パイプ、LoCKなどのコンポーネントを提供します。
1つ、プロセス
構文:Process([group [、target [、name [、args [、kwargs]]]]])
パラメータの意味:targetは呼び出し元オブジェクトを表し、argsは呼び出し元オブジェクトの位置パラメータの祖先を表し、kwargsは呼び出し元オブジェクトの辞書を表します。 nameはエイリアスであり、グループは実際には呼び出されません。
メソッド:is_alive():
join(timeout):
run():
start():
terminate():
属性:authkey、daemon(start()で設定)、exitcode(プロセスの実行中はなし、-Nの場合は、シグナルNで終了することを意味します)、name、pid。デーモンは、親プロセスの終了後に自動的に終了し、それ自体で新しいプロセスを生成することはできないため、start()の前に設定する必要があります。
1. 単一のプロセスとして関数を作成する
from multiprocessing import Process
def func(name):print("%sは良い人でした"%name)if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
p.start() #start()このプロセスを開始するようにシステムに通知します
2. 関数を作成し、それを複数のプロセスとして使用します
from multiprocessing import Process
import random,time
def hobby_motion(name):print('%スポーツのような'% name)
time.sleep(random.randint(1,3))
def hobby_game(name):print('%ゲームのような'% name)
time.sleep(random.randint(1,3))if __name__ =="__main__":
p1 =Process(target=hobby_motion,args=('フーティンティン',))
p2 =Process(target=hobby_game,args=('神戸',))
p1.start()
p2.start()
結果:
FuTingtingはスポーツが好きです
神戸はゲームが大好き
3. プロセスをクラスとして定義します(プロセスを開始する別の方法で、あまり一般的には使用されません)
from multiprocessing import Process
classMyProcess(Process):
def __init__(self,name):super().__init__()
self.name = name
def run(self): #start()の場合、runは自動的に呼び出され、ここでrunとしてのみ定義できます。
print("%sは良い人でした"%self.name)if __name__ =="__main__":
p =MyProcess('kebi')
p.start() #プロセスを親クラスとして扱い、関数をカスタマイズします。
4. デーモンプログラム比較効果
デーモン属性なし
import time
def func(name):print("work start:%s"% time.ctime())
time.sleep(2)print("work end:%s"% time.ctime())if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
p.start()print("this is over")
# の結果
this is over
work start:Thu Nov 3016:12:002017
work end:Thu Nov 3016:12:022017
デーモン属性を追加します
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())
time.sleep(2)print("work end:%s"% time.ctime())if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
p.daemon = True #親プロセスが終了すると、自動的に終了します。新しいプロセスを生成することはできません。開始時に開始する必要があります。()前に設定
p.start()print("this is over")
# の結果
this is over
デーモン属性を設定した後に実行するメソッド:
import time
def func(name):print("work start:%s"% time.ctime())
time.sleep(2)print("work end:%s"% time.ctime())if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
p.daemon = True
p.start()
p.join() #前のコードを実行した後、次を実行します
print("this is over")
# の結果
work start:Thu Nov 3016:18:392017
work end:Thu Nov 3016:18:412017this is over
**5. join():上記のコードを実行した後、裏面のコードを実行します。 ****
例を見てみましょう:
from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"%(name,os.getpid()))
time.sleep(hour)print("Good bother:%s"%name)if __name__ =="__main__":
p =Process(target=func,args=('kebi',2))
p1 =Process(target=func,args=('maoxian',1))
p2 =Process(target=func,args=('xiaoniao',3))
p.start()
p1.start()
p2.start()print("this is over")
結果:
これは#Last実行を超え、最初に印刷します。これは、start()がプロセスを開始するためのものであり、実行する必要があることを示しています。
A lifelong friend:kebi,12048
A lifelong friend:maoxian,8252
A lifelong friend:xiaoniao,6068
わざわざ:maoxian#最初に印刷し、次に実行する
Good bother:kebi
Good bother:xiaoniao
join()を追加
from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"%(name,os.getpid()))
time.sleep(hour)print("Good bother:%s"%name)
start = time.time()if __name__ =="__main__":
p =Process(target=func,args=('kebi',2))
p1 =Process(target=func,args=('maoxian',1))
p2 =Process(target=func,args=('xiaoniao',3))
p.start()
p.join() #上記のコードを実行した後、以下を実行します
p1.start()
p1.join()
p2.start()
p2.join()print("this is over")print(time.time()- start)
# の結果
A lifelong friend:kebi,14804
Good bother:kebi
A lifelong friend:maoxian,11120
Good bother:maoxian
A lifelong friend:xiaoniao,10252 #各プロセスが実行された後、次のプロセスが実行されます
Good bother:xiaoniao
this is over
6.497815370559692 #2+1+3+ メインプログラムの実行時間
位置を変える
from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"%(name,os.getpid()))
time.sleep(hour)print("Good bother:%s"%name)
start = time.time()if __name__ =="__main__":
p =Process(target=func,args=('kebi',2))
p1 =Process(target=func,args=('maoxian',1))
p2 =Process(target=func,args=('xiaoniao',3))
p.start()
p1.start()
p2.start()
p.join() #2秒かかります
p1.join() #この時までにそれは実行されました
p2.join() #2秒間実行され、1秒かかります
print("this is over")print(time.time()- start)
# の結果
A lifelong friend:kebi,13520
A lifelong friend:maoxian,11612
A lifelong friend:xiaoniao,17064 #ほぼ同時に実行を開始
Good bother:maoxian
Good bother:kebi
Good bother:xiaoniao
this is over
3.273620367050171 # 最長時間を優先する
6. その他のプロパティとメソッド
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())
time.sleep(2)print("work end:%s"% time.ctime())if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
p.start()
p.terminate() #プロセスを強制終了し、開始する必要があります()後で、機能はデーモンに似ています
# の結果
this is over
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())
time.sleep(2)print("work end:%s"% time.ctime())if __name__ =="__main__":
p =Process(target=func,args=('kebi',))
# p.daemon = True
print(p.is_alive())
p.start()print(p.name) #プロセスの名前を取得します
print(p.pid) #プロセスのpidを取得します
print(p.is_alive()) #プロセスが存在するかどうかを確認します
print("this is over")
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。
Recommended Posts