python多线程的问题
参考:https://stackoverflow.com/questions/20939299/does-python-support-multithreading-can-it-speed-up-execution-time
GIL 不会阻止线程。 GIL 所做的只是确保一次只有一个线程在执行 Python 代码; 控制仍然在线程之间切换。
GIL 阻止的是使用多个 CPU 内核或单独的 CPU 来并行运行线程。
这仅适用于 Python 代码。 C 扩展可以并且确实发布了 GIL,以允许 C 代码的多个线程和一个 Python 线程跨多个内核运行。 这扩展到由内核控制的 I/O,例如用于套接字读写的 select() 调用,使 Python 在多线程多核设置中合理有效地处理网络事件。
许多服务器部署所做的是运行多个 Python 进程,让操作系统处理进程之间的调度,以最大限度地利用您的 CPU 核心。 如果适合您的用例,您还可以使用多处理库来处理来自一个代码库和父进程的多个进程的并行处理。
请注意,GIL 仅适用于 CPython 实现; Jython 和 IronPython 使用不同的线程实现(分别是本机 Java VM 和 .NET 公共运行时线程)。
直接解决您的更新:任何试图通过并行执行获得速度提升的任务,使用纯 Python 代码,都不会看到加速,因为线程 Python 代码被锁定为一次执行一个线程。 但是,如果您混合使用 C 扩展和 I/O(例如 PIL 或 numpy 操作),则任何 C 代码都可以与一个活动的 Python 线程并行运行。
Python 线程非常适合创建响应式 GUI,或处理多个短 Web 请求,其中 I/O 比 Python 代码更成为瓶颈。 它不适合并行化计算密集型 Python 代码,坚持使用多处理模块来完成此类任务或委托给专用的外部库。
Python 标准库确实有一个多线程库——而且它可以工作。
参考实现(来自 Welcome to Python.org 的 CPython)实现了一个 GIL,以便它在线程之间可靠地引用跟踪。
GIL 意味着来自同一个 Python 进程的两个线程不能同时执行 Python 代码; GIL 在开始执行单个 Python 字节码时获取,并在字节码执行完成时释放。
GIL 不会阻止 Python 程序中的 C 扩展成为多线程——如果一个正在等待 I/O 完成,它也不会阻止两个 Python 线程一起运行。
Python 的其他实现(著名的 JYthon 和 PyPy)不使用 GIL,并且在这些实现中纯 Python 线程是同时执行的; 线程在不同的 CPU 内核上执行。
python多线程的问题的更多相关文章
- python多线程学习记录
1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python多线程
python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- python 多线程就这么简单(续)
之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...
- python多线程监控指定目录
import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...
- python多线程ssh爆破
python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...
- 【python,threading】python多线程
使用多线程的方式 1. 函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...
- <转>Python 多线程的单cpu与cpu上的多线程的区别
你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...
随机推荐
- vs2019 代码片段管理
工具/代码片段管理 上面地址是vs内部代码片段,可以参考写自定义片段 写好的模板保存为.snippet文件,放到固定文件夹中,然后使用添加,直接找到文件夹添加即可 <?xml version=& ...
- Hive数仓基础
架构图: 组成:SQL语句到任务执行需要经过解释器,编译器,优化器,执行器 解释器:调用语法解释器和语义分析器将SQL语句转换成对应的可执行的java代码或业务代码 编译器:将对应的java代码转 ...
- 关于winform 调用本地html页面路径不正确问题
//为了使网页能够与winform交互 将com的可访问性设置为真 [System.Security.Permissions.PermissionSet(System.Security.Permiss ...
- JOI 公園 (JOI Park)
原题链接:AT2434 JOI 公園 (JOI Park) 写完之后看到题解区的三分吓了一跳 分析与解答 由于最终答案与边权有关,所以不妨考虑判断一条边是否会对答案有贡献. 记 \(dis\) 表示以 ...
- lg8935 [JRKSJ R7] 茎 题解
由于标签内包含背包和树形dp,所以考虑用背包dp和树形dp求解. 考虑每次合并2个连通块(一个包含根节点),设\(f_{i,j}\)表示\(i\)子树内,操作\(j\)次的方案数(未合并连通块),设\ ...
- Matplotlib 实现画中画
需要导入的包 inset_axes 要实现画中画,即在原画轴上添加新轴,需要用到mpl_toolkits.axes_grid1.inset_locator的inset_axes. 基本用法 new_a ...
- python实现WPS文件转PDF
实现WPS文件转PDF,需要安装金山WPS import os from win32com.client import Dispatch def wps_et_to_pdf(file, pdf_fil ...
- sheet.getLastRowNum()获取行数不准的问题
// 获得总共有多少行int rowNum = 0;//存在样式的空行.会被统计进来.所以主要的问题是要判断是否是空行.for (int num = 1; num <= sheet.getLas ...
- flink学习总结
flink学习总结 1.Flink是什么? Apache Flink 是一个框架和分布式处理引擎,用于处理无界和有界数据流的状态计算. 2.为什么选择Flink? 1.流数据更加真实的反映了我们的生活 ...
- MYSQL启动:'服务没有相应控制功能'问题解决
启动 MySQL 服务,此处若是显示错误'服务没有相应控制功能' 尝试解决方法:访问如下网站: https://cn.dll-files.com/vcruntime140_1.dll.html 下载 ...