新しく作成された子プロセスでは、全ての情報の親は、互いに独立して、それらの間のデータをコピーします。
作成するos.forkを()を使用します
UNIX / Linuxオペレーティングシステムのための唯一の方法は、ウィンドウで使用することはできません。
import os
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
print('子进程')
else:
print('父进程')
プロセスを使用して作成したクラス
プロセスクラスモジュールを提供するマルチプロセッシングするプロセス・オブジェクトを表現するために、次の例では、その端部の子プロセスと待機を開始示しています。
from multiprocessing import Process
import time
def test(name, age):
for i in range(5):
print("--test--%s\t%d" % (name, age))
time.sleep(1)
print("子进程结束")
if __name__ == '__main__':
p = Process(target=test, args=("aaa", 18))
p.start()
# 等待进程实例执⾏结束,或等待多少秒;
p.join() # 等待的最长时间
print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""
join()メソッドが参加する場合は()コメントアウト、メインプロセスは、子の後に続け、その後、プログラムの終了を完了するために、子供を待つためにブレークダウンせずに開始された、完成された実装をダウン継続する子プロセスのメインプロセス待ちを表します。
join()メソッドは、結果をコメント:
"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""
サブクラスは、プロセスを使用して作成しました
新しいプロセスが流行のようにも使用することができます作成し、あなたは、このクラスの各インスタンスをProcessクラスを継承するクラスをカスタマイズすることができ、プロセスオブジェクトの一例に相当し、次の例を参照してください。
from multiprocessing import Process
import time
import os
class MyProcess(Process):
def __init__(self):
# 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
# Process.__init__(self)
super(MyProcess,self).__init__()
# 重写Porcess的run()方法
def run(self):
print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
for i in range(5):
print("--1--")
time.sleep(1)
if __name__ == '__main__':
t_start = time.time()
p = MyProcess()
p.start()
# p.join()
print("main")
for i in range(5):
print("--main--")
time.sleep(1)
プールのプールを使用してプロセスを作成します。
子プロセスの数が少ない作成する必要があるときは、直接、動的な複数のプロセスに生まれプロセスでマルチプロセッシングを使用することができますが、それは数百またはターゲットの数千、プロセスを作成するには膨大な手作業、であるならば、あなたは使用することができます方法マルチプロセッシングモジュールをプール。
プールの初期化、新しい要求がプールに提出されたプロセスの最大数を指定することができた場合、プールがまだ満杯でない場合、その要求を実行するための新しいプロセスを作成します。しかし、もしプールがあったことをプロセスの数プロセスの終わりにはプールがあるまで最大規定は、その要求は、以下の例を参照、実行するための新しいプロセスを作成します、お待ちしております。
from multiprocessing import Pool
import os
import time
def worker(num):
# for i in range(3):
print("----pid=%d num=%d---" % (os.getpid(), num))
time.sleep(1)
if __name__ == '__main__':
# 定义一个进程池,最大进程数3
pool = Pool(3)
for i in range(10):
print("---%d--" % i)
# 使用非阻塞方式调用func(并行执行),一般用这个。
# apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
pool.apply_async(worker, (i,))
# 关闭进程池
pool.close()
# 等待所有子进程结束,主进程一般用来等待
pool.join() # 进程池后面无操作时必须有这句