fork创建进程
import os
ret = os.fork()
例子
import os
import time
ret = os.fork()
if ret==0:
while True;
print("---1---")
time.sleep(1) #1s
else:
while True:
print("---1---")
time.sleep(1)
主进程不会等待子进程结束
子进程是是一个独立的进程,不会因为主进程的结束而结束,主进程也不会等待子进程结束后再结束
获取进程ID,父进程ID
import os
os.getpid()#获取本进程ID
os.getppid()#获取父进程ID
全局变量在多个进程中不共享
import os
import time
num = 100
ret = os.fork()
if ret==0:
print("---process1--%d"%++num)
else:
time.sleep(1)
print("---process2--%d"%num)
#在process1里num=101
#而在process2里num依然100
多次fork
import os
os.fork()
os.fork()
os.fork()
#即将会产生8个进程(2^fork数)
fork炸弹
import os
while True:
os.fork()
Process创建进程
from multiprocessing import Process
def test():
print("--test--")
p = Process(target=test)
p.start()#开启进程
主进程会先等待Process子进程结束后再结束
from multiprocessing import Process
import time
def test():
for i in range(5):
print("--test--")
time.sleep(1)
p = Process(target=test)
p.start()
#主进程会等待子进程结束后才结束
join
进程阻塞
p = Process(target=test)
p.start()#开启进程
p.join()#阻塞主进程,主进程必须等待p进程结束后才能执行下面句子
p.join(1)#阻塞1秒,若不能再指定时间内完成,则主进程可以执行下面句子
继承Process来创建进程
操作将会在重写的run方法里实现
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print("--MyProcess-run--")
p = MyProcess()
p.start()
进程池
主进程不会等待子进程结束
问题:主进程结束了后,进程池会被销毁,故子进程也会销毁
解决:进程池.join()方法阻塞主进程
from multiprocessing import Pool
import time
import os
def test(i):
for x in range(5):
print("---test-%d-%d-%d"%(os.getpid(),i,x))
time.sleep(1)
po = Pool(3)
for i in range(5):
print(i)
po.apply_async(test,(i,))
po.close()
po.join()
进程池.apply
同步执行排队的进程任务,每次从进程池单独拿出一个进程,进程执行任务,执行时阻塞父进程,执行完一个进程任务后,再去从进程池拿出进程,再去执行下一个进程的任务,直至所有任务执行完毕
如上,进程池有3个进程,5个任务,
首先从进程池拿出进程X从任务队列获取任务1,执行任务,阻塞主进程,执行完毕
然后从进程池拿出进程X从任务列表获取任务2,执行任务,阻塞主进程,执行完毕
进程池.apply_async
异步执行排队的进程任务,尽可能从进程池拿出空闲进程来分配进程任务,各个进程异步执行(同时执行)各自所分配的任务,进程在执行任务的时候并不会阻塞父进程.
进程间通讯-Queue
创建Queue
from multiprocessing Queue
q = Queue(3)#最大size=3
put阻塞放进元素
q.put("--q1--")
q.put("--q2--")
q.put("--q3--")
q.put("--q4--") #由于max size=3,故阻塞等待有空位置
get阻塞获取元素
q.get() #若队列为empty则阻塞等待有内容为止
put_nowait非阻塞放进元素
若满,则抛异常
get_nowait非阻塞获取元素
若empty,则抛异常
进程池中进程之间的通信Queue
from multiprocessing import Manager
q = Manager().Queue()
多进程copy文件
import os
#获取old文件夹名
oldFoldName = input()
#创建一个文件夹
os.mkdir("")
#获取old文件夹中所有文件名
os.listdir("")
#使用多进程copy文件