python基础学习21----进程
2018-10-05 15:36
281 查看
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。
进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://www.geek-share.com/detail/2750792660.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)
未完
相关文章推荐
- python基础学习21----进程
- Python基础学习(5)网络编程socket、文件上传、粘包问题、socketserver、IO多路复用、线程与进程、进程池、线程池、上下文管理、协程
- python基础课程_学习笔记21:文件和材料
- 进程和线程的基础知识——Python学习笔记11
- 零基础入门学习Python(21)--函数:lambda表达式
- python基础教程_学习笔记21:文件和素材
- 零基础入门学习Python(21):魔法方法(1)构造和析构
- 零基础入门学习Python(21)--函数:lambda表达式
- Python学习之路——Linux基础之文件合并与文件归档
- Python基础学习-Python中最常见括号()、[]、{}的区别
- Python基础教程学习第九日:SciPy-数值计算库
- Python+selenium基础学习
- python基础学习以及3.X和2.X的不同
- python学习(3)python基础、使用list和tuple
- python基础学习整理——字典
- Python学习入门基础教程(learning Python)--3.3.1 Python下的布尔表达式
- Python零基础该如何学习
- 【Python2.7 学习笔记】Python 基础(二)
- python基础学习小作业(一)
- file()创建文件方法 分类: python python基础学习 2012-12-24 18:17 239人阅读 评论(0) 收藏