python中的多进程、多线程、协程
2018-12-17 17:32:16 0 举报
AI智能生成
为你推荐
查看更多
多进程、多线程、协程
作者其他创作
大纲/内容
python多进程、多线程、协程
协程
概念及简介
协程从代码级实现并发,操作系统感知不到,粒度越细,开发难度越大
greenlet
模块导入:from greenlet import greenlet
创建对象:g1=greenlet(eat)
切换对象:g1.switch('egon')
缺点:该模块不能自动实现来回切换
示例代码
from greenlet import greenletdef eat(name): print('%s eat 1' %name) g2.switch('egon') print('%s eat 2' %name) g2.switch()def play(name): print('%s play 1' %name) g1.switch() print('%s play 2' %name)g1=greenlet(eat)g2=greenlet(play)g1.switch('egon')#可以在第一次switch时传入参数,以后都不需要
Gevent
gevent模块:import gevent
创建对象并执行:g1=gevent.spawn(eat)
控制
对象.join方式:g1.join()
gevent阻塞:gevent.sleep(1)
其他阻塞识别
from gevent import monkey;monkey.patch_all()
示例代码1
示例代码2
多进程
multiprocess模块
创建进程
target:目标函数,不加括号
args=():通过元组将子进程需要参数传入
kwargs={‘k’:'v'}关键字传参
进程开启、控制和结束
P.start()开启子进程,调用Process类中的run()方法
P.join()控制主进程等待子线程结束后再往后执行,timeout可设置等待的最长时间
P.is_alive()判断子进程P是否还在运行
P.terminate()强制终止,可能导致P的子进程成为僵尸进程
实例代码
进程依赖
守护进程
P.daemon=True放在p.start()之前
信号量
Semaphore模块:from multiprocessing importSemaphore
创建信号量对象:sem=Semaphore(4)
信号的获取,sem.acquire()
信号的释放,sem.release()
事件
Event模块:from multiprocessing import Event
e = Event()
e.set()
e.clear()
e.is_set()
进程间通信
进程间是数据隔离的,通过队列、通道实现进程间的通信
pipe
queue
Queue模块:from multiprocessing import Queue
q=Queue([maxsize])创建允许最大顶数为maxsize的共享队列
q.put(content)将数据放入栈中,栈满时发生阻塞;q.put_nowait(content)栈满时不会阻塞,但会报错
q.get()从栈中取出数据,栈空时阻塞;q.get_nowait()栈空时不会阻塞,但会报错
数据隔离和数据安全
进程间是数据隔离的,但这种隔离主要是指内存级别的,当多进程同时操作文件(硬盘)中的数据时还是存在数据安全问题,为了保证数据安全就要用到锁
锁
创建锁对象:lock=Lock()
锁的获取,lock.acquire()
锁的释放,lock.release()
死锁
递归锁
Rlock
资源占用的问题
进程池
Pool模块
Pool模块:from multiprocessing import Pool
创建进程池对象:p=Pool(n),n为允许同时执行的最大进程数
p.join()控制主进程在子进程结束后继续进行
ProcessPoolExecutor
创建对象:executor=ProcessPoolExecutor(max_workers=3)
关闭进程:executor.shutdown(True)
获取进程结果:future.result()
回调函数:add_done_callback(fn)
多线程
threading模块
创建线程
Thread模块:from threading import Thread
args=():通过元组将线程程需要参数传入
线程开启、控制和结束
t.start()开启子线程,调用Thread类中的run()方法
t.join()控制主线程等待子线程结束后再往后执行,timeout可设置等待的最长时间
t.is_alive()判断子进程t是否还在运行
t.enumerate()返回正在运行的子线程列表
线程依赖
守护线程
t.setDaemon(True)放在t.start()之前
Semaphore模块:from threading import Thread,Semaphore
示例代码:
Event模块:from threading import Thread, Event
条件condition
Condition模块:from threading import Thread,Condition
con=Condition()
con.acquire() con.notify(int(inp)) con.release()
con.acquire() con.wait() con.release()
数据共享和数据安全
进程间是数据共享的,当多线程同时操作数据时存在数据安全问题,为了保证数据安全就要用到锁
多线程或多进程争抢共同的资源,原因是设置的多把互斥锁不合理
科学家吃面:fork_lock = noodle_lock = RLock()
线程中的Queue和进程的Queue不同,线程中更强调数据安全(通道+锁),而不是数据通信,它的导入是从独立的queue模块
Queue模块:from queue import Queue
q.put(content)将数据放入栈中
q.get()从栈中取出数据
线程池
ThreadPoolExecutor
创建对象:executor=ThreadPoolExecutor(max_workers=3)
关闭线程:executor.shutdown(True)
获取线程结果:future.result()
0 条评论
回复 删除
下一页