python当中的并发

并发的表现形式,并行处理是软件工程领域最广泛的话题之一。

两个事件互不影响,则两个事件是并发的。
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 的好处。