python多线程并发

进程与线程

丶灬走出姿态 提交于 2019-11-26 17:31:16
进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程

Python—进程和线程

荒凉一梦 提交于 2019-11-26 17:11:37
并行和并发 并发: 指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务, 如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效 果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已. 例: 就类似于你,吃一口饭喝一口水,以正常速度来看,完全能够看的出来,当你把这个过程以n倍速度执行 时..可以想象一下. 并行:指应用能够同时执行不同的任务. 例:吃饭的时候可以边吃饭边打电话,这两件事情可以同时执行 两者区别:一个是交替执行,一个是同时执行. 进程和线程 概念: 进程 就是操作系统中执行的一个程序,一个进程还可以拥有多个 并发 的执行线索,简单的说就是拥有多个 可以获得CPU调度的执行单元,这就是所谓的 线程 。 """ 单进程 """ from multiprocessing import Process from os import getpid from random import randint from time import time, sleep def download_task(filename): print('启动下载进程,进程号[%d].' % getpid()) print('开始下载%s...' % filename) time_to_download =

python编程技巧——转载

梦想与她 提交于 2019-11-26 16:28:37
学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强大的gmbox,也就不用写了。 这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,再加上simplecd这个半爬虫半网站的项目,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了。 1.最基本的抓站 Python import urllib2 content = urllib2.urlopen(' http://XXXX').read () 1 2 import urllib2 content = urllib2.urlopen(' http://XXXX').read () 2.使用代理服务器 这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。 Python import urllib2 proxy_support = urllib2.ProxyHandler({'http':' http://XX.XX.XX.XX:XXXX '}) opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler) urllib2

Python核心技术与实战——十八|Python并发编程之Asyncio

早过忘川 提交于 2019-11-26 14:01:10
我们在上一章学习了Python并发编程的一种实现方法——多线程。今天,我们趁热打铁,看看Python并发编程的另一种实现方式——Asyncio。和前面协程的那章不太一样,这节课我们更加注重原理的理解。 通过上节课的学习,我们知道在进行I/O操作的时候,使用多线程与普通的单线程比较,效率有了很大的提高,既然这样,为什么还要Asyncio呢? 虽然多线程有诸多优点并且应用广泛,但是也存在一定的局限性: ※多线程运行过程很容易被打断,因此有可能出现race condition的情况 ※线程的切换存在一定的消耗,线程数量不能无限增加,因此,如果I/O操作非常密集,多线程很有可能满足不了高效率、高质量的需求。 针对这些问题,Asyncio应运而生。 什么是Asyncio? Sync VS Async 我们首先来区分一下Sync(同步)和Async(异步)的概念。 ※所谓Sync,是指操作一个接一个的执行,下一个操作必须等上一个操作完成后才能执行。 ※而Async是指不同操作之间可以相互交替执行,如果某个操作被block,程序并不会等待,而是会找出可执行的操作继续执行。 举个简单的例子,我们要做一个报表并用邮件发送给老板,看看两种方式有什么不同: ※按照Sync的方式,我们相软件里输入各项数据,然后等5分钟生成了报表明细以后,再写邮件发送给老板 ※而按照Async的方式,在输完数据以后

探讨《Python游戏编程第4版》PDF代码+《疯狂Python讲义》面试题PDF代码研究

纵然是瞬间 提交于 2019-11-26 11:07:00
对于大多数需要用到编程语言的爱好者来说,Python是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 python语言现在很流行了,除了用在学校,也用在很多行业。python学起来较为简单,语法容易理解,也可用于数据分析。 国内的教材推荐看《疯狂python讲义》,对比国外也有很多好的参考,《python核心编程第3版》值得学习。如果从兴趣出发,建议看看《Python游戏编程快速上手第4版》。 《疯狂Python讲义》涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识。系统讲解了Python的基本语法结构、Python的函数编程、Python的类和对象、模块和包、异常处理等核心语法;介绍Python常用的内置模块和包,包括Python的JSON、正则表达式支持、容器相关类、collections包、Tkinter GUI编程、IO编程、数据库编程、并发编程、网络通信编程等内容;介绍Python开发工程化方面的内容,包括如何为Python程序编写符合格式的文档注释、提取文档注释生成帮助文档,为Python程序编写测试用例,程序打包等内容;引入了pygame、Matplotlib、Pygal、Scrapy这些第三方的包,通过项目介绍了Python游戏开发、大数据展示、网络爬虫等热门技能,尤其是网络爬虫和大数据展示。 《疯狂Python讲义》PDF

python库包大全(转)

一个人想着一个人 提交于 2019-11-26 10:59:22
python 库资源大全 转自: Python 资源大全中文版 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具。 官网 pyenv:简单的 Python 版本管理工具。 官网 Vex:可以在虚拟环境中执行命令。 官网 virtualenv:创建独立 Python 环境的工具。 官网 virtualenvwrapper:virtualenv 的一组扩展。 官网 包管理 管理包和依赖的工具。 pip:Python 包和依赖关系管理工具。 官网 pip-tools:保证 Python 包依赖关系更新的一组工具。 官网 pipenv:Pyhton 官方推荐的新一代包管理工具。 官网 conda:跨平台,Python 二进制包管理工具。 官网 Curdling:管理 Python 包的命令行工具。 官网 wheel:Python 分发的新标准,意在取代 eggs。 官网 包仓库 本地 PyPI 仓库服务和代理。 warehouse:下一代 PyPI。 官网 Warehouse: 预览 bandersnatch:PyPA 提供的 PyPI 镜像工具。 官网 devpi:PyPI 服务和打包 / 测试 / 分发工具。 官网 localshop:本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。 官网 分发 打包为可执行文件以便分发。

Python怎么利用多核cpu

天涯浪子 提交于 2019-11-26 04:28:55
<!--一个博主专栏付费入口结束--> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css"> <div id="content_views" class="markdown_views prism-atom-one-dark"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <h2><a name="t0"></a><a id="GIL__Python__0"></a>GIL 与 Python 线程的纠葛</h2> GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题。运行下面这段 python 程序,CPU 占用率是多少? def dead_loop ( )

python数据结构和GIL及多进程

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-25 20:48:19
一 数据结构和GIL 1 queue 标准库queue模块,提供FIFO的queue、LIFO的队列,优先队列 Queue 类是线程安全的,适用于多线程间安全的交换数据,内部使用了Lock和Condition 为什么说容器的大小不准确,其原因是如果不加锁,是不可能获取到准确的大小的,因为你刚读取了一个大小,还没取走,有可能被就被其他线程修改了,queue类的size虽然加了锁,但是依然不能保证立即get,put就能成功,因为读取大小和get,put方法是分来的。 2 GIL 1 简介 全局解释器锁,进程级别的锁GIL Cpython在解释器进程中有一把锁,叫做GIL全局解释器锁。 GIL 保证Cpython进程中,当前时刻只有一个线程执行代码,甚至在多核情况下,也是如此。 2 IO 密集型和CPU密集型 Cpython中 IO 密集型,由于线程阻塞,就会调度其他线程 CPU密集型,当前线程可能连续获取GIL,导致其他线程几乎无法使用CPU,若要唤醒其他线程,则需要准备数据,其代价是高昂的。 IO 密集型,多线程解决,CPU密集型,多进程解决,绕开GIL。 python中绝大多数内置数据结构的读写操作都是原子操作 由于GIL 的存在,python的内置数据类型在多线程编程的时候就变得安全了,但是实际上他们本身不是线程安全类型的 3 保留GIL 原因 Guido坚持的简单哲学