text Python的多线程指南
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text Python的多线程指南相关的知识,希望对你有一定的参考价值。
from concurrent import futures
# 1. 创建线程池
thread_pool = futures.ThreadPoolExecutor(2 * 10)
# 2. 使用submit提交任务
df_future_list = [self._thread_pool.submit(self._read_source, source, path) \
for source, path in unread_path_list]
# 3. 拿到future list进行处理
for df_future in futures.as_completed(df_future_list):
source_name, tmp_df = df_future.result() # 使用as_completed方法时, 运行到这里的都是有结果了的数据
if tmp_df is not None:
if source_name not in source_df_dict:
source_df_dict[source_name] = tmp_df
else:
source_df_dict[source_name] = source_df_dict[source_name].union(tmp_df)
# 4. 如果只需要使用一次即关闭, 推荐使用with语句; 否则的话创建后一直保持打开即可.
参考:<<流畅的Python>>
生成器作为协程(协程并发)
==============
协程实现的是并发而不是并行. 只要有IO操作, 并发就是有意义的, 即使是单线程并发.
yield关键字可以在Python2.5以后使用.
Python3.3引入了yield from句法, 且生成器可以返回一个值.
concurrent.futures模块(多线程并发/多进程并行)
======================
参考链接: http://blog.gusibi.com/post/python-concurrency-with-futures/
适用版本: Python3.2引入, Python2.5以后可以从PyPI安装futures包来使用.
注意: 本模块只不过是线程进程的一种API的高层封装. 实际上是对Python threading模块的封装. 如果有线程定制的需求(例如创建线程安全的队列, 在线程间传递数据), 还是需要使用底层的threading模块来定制; 对于进程定制的需求, 使用multiprocessing模块来进行, 使用方法与threading模块基本一致.(详见17.5.3章节)
写出来的并发脚本实际上并不能并行执行, 因为受到GIL(Global Interperter Lock, 全局解释器锁)的限制. 但是GIL几乎对I/O密集型处理无害. 因为阻塞IO的函数基本上都会在等待的时候释放GIL, Python线程就可以利用这个特点来干其他的事, 实现伪多线程, 并且实际上也会提高程序执行效率.
但是对于CPU密集型应用来说, Python的多线程是鸡肋. 这时候需要使用多进程的方式. 本模块中多进程和多线程的接口是统一的.
适用场景:
1. IO密集型应用(伪多线程处理, 受GIL管制, 但会及时释放)
2. CPU密集型应用(多进程处理, 不受GIL管制)
常用类:
1. futures.ThreadPoolExecutor
2. futures.ProcessPoolExecutor
asyncio模块(协程异步并发)
===========
Python3.4引入, 兼容Python3.3, 包本身由于大量使用了yield from这个Python3.3引入的句法, 所以与之前的Python版本不兼容. 但是trollius项目使用yield替换了yield from, 使得能够支持Python2.6以上版本.
解决阻塞调用的方法:
- 使用多线程
- 异步调用(回调或者协程)
代码在单线程中执行, 并不是真正的并发执行.
底层实现原理是使用事件循环驱动的协程实现并发. 异步系统的好处是直接依赖底层线程(内核级线程), 避免了用户级线程的开销(Java线程对象, Python线程对象实际上都是用户级的线程, 并不是系统级的线程), 能够比传统的多线程程序管理更多并发连接.
==============
例子: 见下面
以上是关于text Python的多线程指南的主要内容,如果未能解决你的问题,请参考以下文章
python中的多线程
Python的多线程GIL浅谈
Python 中的多线程还是串行处理?
Python中的多线程并行运行
python中的多线程
python 的多线程执行速度