文章目录
一、多进程提要
什么是进程:
进程:在了解多线程的前提下,可以把某几个关联线程的集合叫做进程,又或者正在运行中的程序,是一个进程
python多进程须知:
(1) python多进程
为了解决python中,因为GIL(全局解释器锁)的存在,而不能使用更加完整的多线程的问题,想要更加充分的使用cpu资源,在python中,大部分情况要使用到多进程,同时在python中,它提供了一个名为multiprocessing的多进程模块帮助程序员更方便的使用python中的多进程。
(2)缺点提要
在多进程中,通常需要避免共享资源。
与多线程不同,在多进程中,每个进程间,都是相互独立的,它无法做到多个进程间直接共用某个全局变量。
当然,解决该问题,可以使得多个进程关联某个主进程,实现多个进程间的内存共享,而这样做的缺点在于提高了程序的复杂度,同时因为需要同步进程的原因,降低了程序的执行效率。
二、multiprocessing模块
提要:multiprocessing模块的基本调用格式,与多线程threading模块相似
1.创建多进程
import multiprocessing
import time
def run(ret):
time.sleep(1)
print('running....%s'%ret)
if __name__ == '__main__':
list1 = []
for i in range(5):
multi1 = multiprocessing.Process(target=run, args=('lists..',))
list1.append(multi1)
for p in list1:
p.start()
输出:
running....lists..
running....lists..
running....lists..
running....lists..
running....lists..
2.类创建多进程
import multiprocessing
import os
import time
class Myprocess(multiprocessing.Process):
def __init__(self,name):
super(Myprocess,self).__init__()
self.name = name
def run(self): #重写父类中的run方法
time.sleep(1)
print('This is father process id:%s'%os.getpid())
print('This is son process id:%s'%os.getppid())
print('process name:%s'%self.name)
if __name__ == '__main__':
process1 = Myprocess('Cj')
process1.start()
process1.join()
process2 = Myprocess('azhe?')
process2.start()
输出:
This is father process id:9956
This is son process id:14108
process name:Cj
This is father process id:1732
This is son process id:14108
process name:azhe?
3.进程通讯工具:Queue
以下为:支进程拿取主进程数据
from multiprocessing import Process, Queue
def f(q):
q.put(['这是进程Queue,不是线程queue'])
if __name__ == '__main__':
q = Queue()
list1=[]
for i in range(3):
p = Process(target=f, args=(q,))
list1.append(p)
p.start()
for t in range(3):
print(q.get())
for i in list1:
i.join()
4.进程通讯工具:Pipe
from multiprocessing import Process, Pipe
def f(conn):
conn.send(['这就是Pipe'])
conn.close()
if __name__ == '__main__':
father_conn,son_conn = Pipe() #Pipe()将返回两个对象,一个是当前进程端口,一个是通讯进程端口
p = Process(target=f, args=(son_conn,))
p.start()
print(father_conn.recv())
p.join()
输出:
['这就是Pipe']
5.进程通讯工具:Manager
以下为:通过主进程为支进程空字典和列表赋值
from multiprocessing import Process,Manager
def function(p,d,i):
p[i] = 'zhe?'
d.append('???')
print(i)
if __name__ == '__main__':
with Manager() as f:
P_dict = f.dict()
P_list = f.list()
press_list = []
for i in range(3):
p = Process(target=function , args=(P_dict,P_list,i))
press_list.append(p)
p.start()
for i in press_list:
i.join()
print(P_dict)
print(P_list)
输出:
1
0
2
{1: 'zhe?', 0: 'zhe?', 2: 'zhe?'}
['???', '???', '???']