并发的表现形式,并行处理是软件工程领域最广泛的话题之一。
两个事件互不影响,则两个事件是并发的。
CPython的线程实现中带有一些麻烦的细节,使得实用性降低了。
GIL 只是强制在任何时候只有一个线程可以执行python代码
多线程可以使用的场景:
- 构建响应式界面
- 委派工作
- 构建多用户应用程序
如何让用户控制使用哪个处理后端(进程或者线程)
from multiprocessing import Pool as ProcessPool
from multiprocessing.dummpy import Pool as ThreadPool
def main(use_threads=False):
if use_threads:
pool_cls = ThreadPool
else:
pool_cls = ProcessPool
with pool_cls(4) as p:
results = p.map(fetch_place, PLACES)
for result in results:
present_result(result)
异步编程
异步编程的解决方案,如twisted tornado eventlet,真的值得了解
协同多任务是异步编程的核心。每个进程都在空闲时自动释放控制以允许同时执行多个程序。
gevent 的工作方式,gevent 的作用一条线程跑多个协程,适合多 IO 操作。
需要强调的是引入 gevent 不会加快获取数据的速度,例如,原来是 30ms,引入之后不会变少,只会变多,那么引入的好处是什么?原来你能在1秒之内接待33个客户端请求,引入之后可能可以接待100个/s,也可能接待 300个/s,这才是 gevent 的好处。