一 并发的本质 网络
1 切换多线程
2 保存状态并发
二 协程的概念函数
协程,又称微线程,纤程。英文名Coroutine。单线程下实现并发,用户从应用程序级别控制单线程下任务的切换,注意必定是遇到I/O才切。性能
协程的特色在因而一个线程执行,那和多线程比,协程有何优点?spa
最大的优点就是协程极高的执行效率。由于子程序切换不是线程切换,而是由程序自身控制,所以,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优点就越明显。线程
第二大优点就是不须要多线程的锁机制,由于只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只须要判断状态就行了,因此执行效率比多线程高不少。code
由于协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可得到极高的性能。协程
三 gevent模块对象
gevent是一个基于协程的Python网络库。
须要导入猴子补丁。
方法:
g1=gevent.spawn(func,):提交任务。 生成g1,是Greenlet类
gevent.sleep():睡
gevent.joinall(可迭代对象):阻塞,知道全部选中的任务执行完毕。
g1.join()
g1.value 获取由func函数生成Greenlet类的返回值。
import gevent from gevent import monkey;monkey.patch_all() from threading import current_thread import time def foo(): print('%s is running ' % current_thread().getName()) time.sleep(1) print('%s is done '%current_thread().getName()) def bar(): print('%s is running ' % current_thread().getName()) time.sleep(2) print('%s is done ' % current_thread().getName()) g1=gevent.spawn(foo) g2=gevent.spawn(bar) print('g1',g1) print('g2',g2) # g1.join() # g2.join() gevent.joinall([g1,g2])
输出:
g2 <Greenlet at 0x26d7aff0898: bar> DummyThread-1 is running DummyThread-2 is running DummyThread-1 is done DummyThread-2 is done