python基础学习21----进程
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。
进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://www.cnblogs.com/sfencs-hcy/p/9721362.html
multiprocessing模块
1.进程的创建
import multiprocessing def func(msg): print(msg) print("这是一个进程") if __name__=="__main__": p=multiprocessing.Process(target=func,args=("hello world",)) p.start()
以继承类的方式创建进程
import multiprocessing class Myprocessing(multiprocessing.Process): def __init__(self,name,age): multiprocessing.Process.__init__(self) self.name=name self.age=age def run(self): #这里是将threading.Thread中的run方法进行了重载 print("%s is %d"%(self.name,self.age)) if __name__=="__main__": t=Myprocessing("sfencs",19) t.start()
2.进程的并行
import multiprocessing import time class Myprocessing(multiprocessing.Process): def __init__(self,name,age,second): multiprocessing.Process.__init__(self) self.name=name self.second=second self.age=age def run(self): print(self.name) time.sleep(self.second) print(self.age) if __name__=="__main__": time_begin=time.time() p1=Myprocessing("sfencs",19,2) p2=Myprocessing("Tom",25,5) p1.start() p2.start() p1.join() p2.join() time_end=time.time() print(time_end-time_begin) ''' Tom 19 25 5.198107481002808 '''
join的用法和线程相同
3.守护进程
守护进程与守护线程的原理相同,只不过设置守护进程的方式为p.daemon=True
4.lock
lock的作用同多线程,实现方式有两种
import multiprocessing def func2(lock,f): with lock: fs=open(f,'a+') fs.write('Lockd acquired via with\n') fs.close() def func1(lock,f): lock.acquire() fs=open(f,'a+') fs.write('Lock acquired directly\n') fs.close() lock.release() if __name__=="__main__": lock=multiprocessing.Lock() f = "file.txt" p1=multiprocessing.Process(target=func2,args=(lock,f,)) p2=multiprocessing.Process(target=func1,args=(lock,f,)) p1.start() p2.start() p1.join() p2.join()
与线程不同的是,这里lock是以参数方式传递,因为不同的进程并不能共享资源
5.Semaphore
用来控制对共享资源的最大访问数量
import multiprocessing import time def func(s, i): s.acquire() print(multiprocessing.current_process().name + "acquire"); time.sleep(2) print(multiprocessing.current_process().name + "release\n"); s.release() if __name__ == "__main__": s = multiprocessing.Semaphore(2) for i in range(5): p = multiprocessing.Process(target = func, args=(s, 2)) p.start()
6.event与线程用法相同
7.队列
有一个专门属于多进程的队列multiprocessing.Queue
import multiprocessing def writer(q): q.put("hello world") def reader(q): print(q.get()) if __name__ == "__main__": q = multiprocessing.Queue() pwriter=multiprocessing.Process(target=writer,args=(q,)) preader = multiprocessing.Process(target=reader, args=(q,)) pwriter.start() preader.start()
8.管道pipe
Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。
import multiprocessing def sender(p): p.send("hello world") def receiver(p): print(p.recv()) if __name__ == "__main__": p = multiprocessing.Pipe() psender=multiprocessing.Process(target=sender,args=(p[0],)) preceiver = multiprocessing.Process(target=receiver, args=(p[1],)) psender.start() preceiver.start()
9.manager
manager实现进程之间数据共享
import multiprocessing def func(list1,d,i): list1[i]=i d["a"]=i if __name__ == "__main__": with multiprocessing.Manager() as manager: list1=manager.list(range(5,10)) d=manager.dict() plist=[] for i in range(5): p=multiprocessing.Process(target=func,args=(list1,d,i)) plist.append(p) p.start() for i in plist: i.join() print(list1) print(d)
未完