1、多进程
from time import sleep
from multiprocessing import Process
import os
"""
os.getpid() : 获得当前进程号
os.getppid(): 获得父进程号
p = Process(任务,任务名):创建一个进程
p.start() : 开始进程
p.terminate():终止进程
"""
def task(s,name):
while True:
sleep(s)
print("这是task",os.getpid(),"----------",os.getppid(),"time:",s,"name:",name)
def task1(s,name):
while True:
sleep(2)
print("这是task1",os.getpid(),"----------",os.getppid(),"time:",s,"name:",name)
if __name__ == '__main__':
print("**********",os.getpid())
p = Process(target=task,name="task",args=(1,"tv"))
p.start()
print(p.name)
p1 = Process(target=task1,name="task1",args=(2,"cp"))
p1.start()
print(p1.name)
number = 1
while True:
number += 1
if number == 50:
p.terminate()
p1.terminate()
break
else:
print("-------------",number)
"""
task
task1
-------------
*********** # 主进程进行的事情
# 下面是子进程进行的事情
这是task
这是task1
这是task
这是task
这是task1
这是task
这是task
...
Process finished with exit code -1
"""
2、进程池
from multiprocessing import Pool
import time
import random
import os
"""
阻塞式进程:一次性进入
非阻塞式进程:一个一个进入,相当于先加到队列里,有队列进入池子,可以设置进程数量,还可以进程复用。
结束就返回,其他的就可以进入。回调是谁先结束谁去回调函数去记录一下
回调函数等任务完成就调用
"""
def task(task_name):
print("start doing",task_name)
start = time.time()
time.sleep(random.random()*2)
end = time.time()
return "finish task:{},use time:{},process id:{}".format(task_name,(end-start),os.getpid())
container = []
def callback_func(n):
container.append(n)
if __name__ == '__main__':
pool = Pool(5)
tasks = ["listen","write","washes","play","run","read","look","doctor"]
for task1 in tasks:
pool.apply_async(task,args=(task1,),callback=callback_func)
pool.close()
pool.join()
for i in container:
print(i)
print("over")
"""
start doing listen
start doing write
start doing washes
start doing play
start doing run
start doing read
start doing look
start doing doctor
finish task:listen,use time:0.035909175872802734,process id:20524
finish task:washes,use time:0.3520622253417969,process id:21344
finish task:look,use time:0.19447803497314453,process id:21344
finish task:run,use time:0.8018584251403809,process id:9484
finish task:write,use time:1.604302167892456,process id:21348
finish task:doctor,use time:1.3295471668243408,process id:21344
finish task:read,use time:1.8770811557769775,process id:20524
finish task:play,use time:1.977813720703125,process id:8748
over
"""
3、进程通信
from multiprocessing import Process,Queue
from time import sleep
def download(q):
images = ["1.png","2.png","3.png"]
for image in images:
print("正在下载:",image)
sleep(0.5)
q.put(image)
def getfile1(q):
file = q.get()
print("{}保存成功".format((file)))
def getfile2(q):
while True:
file = q.get()
print("{}保存成功".format((file)))
def getfile(q):
while True:
try:
file = q.get(timeout=2)
print("{}保存成功".format((file)))
except:
print("全部保存完了")
break
if __name__ == '__main__':
q = Queue(5)
p1 = Process(target=download,args=(q,))
p2 = Process(target=getfile,args=(q,))
p1.start()
p1.join()
p2.start()
p2.join()
print("over")
"""
正在下载: 1.png
正在下载: 2.png
正在下载: 3.png
1.png保存成功
2.png保存成功
3.png保存成功
全部保存完了
over
"""