【流畅的python】笔记(C17:使用期物处理并发)自测知识点和书籍补充
C17:使用期物处理并发
17.1 示例: 网络下载的三种风格
17.1.2 使用concurrent.futures模块下载
总结:不返回期物的多线程
➐ 返回获取的结果数量;如果有线程抛出异常,异常会在这里抛出,这与隐式调用 next()函数从迭代器中获取相应的返回值一样。
17.1.3 期物在哪里
总结:返回期物的多线程
有时候存在字典中可能更让你方便,这取决于你的任务。
自测
1. 什么叫做期物”(future) ?
2. 期物的.done()方法作用,是否阻塞?
3. 期物的.add_done_callback() 方法作用?
4. 期物的.result() 方法作用?
答案
1.
期物指一种对象,表示异步执行的操作。
2.
这两种期物都有 .done() 方法,这个方法不阻塞,返回值是布尔值,指明期物链接的可调用对象是否已经执行。
3.
这个方法只有一个参数,类型是可调用的对象,期物运行结束后会调用指定的可调用对象。
4.
17.2 阻塞型I/O和GIL
自测
**1.为什么说python的多线程无用,但为什么我们用得合理时,它却确确实实的提高的执行速度? **
答案
1.
因为有全局解释器锁(GIL),一次只允许使用一个线程执行 Python 字节码。因此,一个 Python 进程通常不能同时使用多个 CPU 核心。
但标准库中所有执行阻塞型 I/O 操作的函数,在等待操作系统返回结果时都会释放GIL。这意味着在 Python 语言这个层次上可以使用多线程,而 I/O 密集型 Python 程序能从中受益:一个 Python 线程等待网络响应时,阻塞型 I/O 函数会释放 GIL,再运行一个线程。
组织一下语言就是GIL锁在python中是一直存在的,但标准库中所有执行阻塞型 I/O 操作的函数,这种存在可以暂时释放掉
17.3 使用concurrent.futures模块启动进程
总结:返回期物的多进程
自测
1. 为什么普通电脑开启了多线程20个和开启了多进程20个,后者会更慢 ?
2. 有库可以实现真正的多个CPU运算吗,而不受GIL限制吗?
3. 什么时候你会选择开多进程?
答案
1.
因为一般电脑CPU都在4个左右,在这种情况后者限制只能有4个并发下载。
2.
有啊,不要因外界限制你的想象力了。
比如concurrent.futures 模块使用 ProcessPoolExecutor 类把工作分配给多个 Python 进程处理。因此,如果需要做 CPU 密集型处理,使用这个模块能绕开 GIL,利用所有可用的 CPU 核心。
3.
需要CPU做密集型作业时
17.4 实验Executor.map方法
总结:并发运行多个可调用的对象
自测
1. map和 (把 Executor.submit 方法和 futures.as_completed 函数结合)两种方式结合起来区别?
答案
1.
顺序不同