python多线程并发

GIL全局解释器锁

六月ゝ 毕业季﹏ 提交于 2019-12-09 18:08:45
拓展 什么是GIL全局解释器锁 为什么要有GIL全局解释器锁? GIL全局解释器锁的优缺点 多线程和IO密集型的应用场景 转载文章 TOC 拓展 python解释器: Cpython C语言写的 Jpython java语言写的 什么是GIL全局解释器锁 在同一个进程下开启的多线程,同一时刻只能有一个线程执行,因为Cpython的内存管理不是线程安全 摘自官方文档解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) 结论:在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势。 为什么要有GIL全局解释器锁?

Python面试总结

不羁岁月 提交于 2019-12-09 13:52:10
目录 Python基础 1. print()函数调用Python底层的什么方法? 2. 简单说下对input()函数的理解 3. read、readline和readlines的区别 4. 在except中return还会不会执行finally中的代码?如何抛出自定义异常? 5. 内存小于文件大小的场景,如何读入文件内容?怎么实现? 6. 字符串拼接使用+和使用str.join()方法的比较 7. 经典类和新式类的区别 8. 单例模式实现 9. 赋值、浅拷贝和深拷贝 9.1 赋值 9.2 浅拷贝 9.3 深拷贝 10. Python单元测试框架 11. 输入年、月、日,判断这一天是这一年的第几天 12. 列举random模块的常用方法 13. lambda函数 14. 闭包 Python并发 1. Python线程的描述 2. Python进程的描述 3. 进程与线程的区别 4. Python多线程执行耗时长的原因 数据库 1. 使用 Python DB Api访问数据库流程 Linux 1. find . 2. 查找目录中大于特定大小的文件 算法 1. 冒泡排序 1.1 原理 1.2 代码 1.3 分析 TCP/IP 1. 常见HTTP状态码 1.1 404 1.2 403 1.3 500 编程题 题目1:求字符串中的最长子串 题目描述 解决方案 代码 题目2: 求一个数的n次方

python 线程,GIL 和 ctypes

☆樱花仙子☆ 提交于 2019-12-09 12:18:01
GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题。运行下面这段 python 程序,CPU 占用率是多少? 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU。在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU。那如何能让它在双核机器上占用 100% 的 CPU 呢?答案很容易想到,用两个线程就行了,线程不正是并发分享 CPU 运算资源的吗。可惜答案虽然对了,但做起来可没那么简单。下面的程序在主线程之外又起了一个死循环的线程 import threading def dead_loop(): while True: pass 新起一个死循环线程 t = threading.Thread(target=dead_loop) t.start() 主线程也进入死循环 dead_loop() t.join() 按道理它应该能做到占用两个核的 CPU 资源,可是实际运行情况却是没有什么改变,还是只占了 50% CPU 不到。这又是为什么呢?难道 python 线程不是操作系统的原生线程?打开 system monitor 一探究竟

Python之threading模块的使用

风流意气都作罢 提交于 2019-12-08 16:40:41
作用:同一个进程空间并发运行多个操作,专业术语简称为:【多线程】 1、任务函数不带参数多线程 #!/usr/bin/env python # -*- coding: utf-8 -*- import threading def worker(): print('worker...') threads = [] for i in range(3): task = threading.Thread(target=worker) threads.append(task) task.start() print(threads) threading_simple.py 运行效果 [root@ mnt]# python3 threading_simple.py worker... worker... worker... [<Thread(Thread-1, stopped 140040860006144)>, <Thread(Thread-2, stopped 140040860006144)>, <Thread(Thread-3, stopped 140040860006144)>] 2 、任务函数带参数多线程 #!/usr/bin/env python # -*- coding: utf-8 -*- import threading def worker(num): print(

python基础-并发编程part01

最后都变了- 提交于 2019-12-07 00:07:26
并发编程 操作系统发展史 穿孔卡片 读取数据速度特别慢,CPU利用率极低 单用户使用 批处理 读取数据速度特别慢,CPU利用率极低 联机使用 脱机批处理(现代操作系统的设计原理) 读取数据速度提高 CPU的利用率提高 多道技术(基于单核背景下产生的) 单道(串行):一个任务完完整整地运行完毕后,才能运行下一个任务 多道技术:允许多个程序同时进入内存并运行。同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。 多道技术的实现是为了解决多个程序竞争或者说共享同一个资源的有序调度问题 ,解决方式即 多路复用 ,多路复用分为时间上的复用和空间上的复用。 空间上的复用 :多个程序使用一个CPU(多个进程复用内存空间) 时间上的复用 :多个进程复用CPU的时间 当执行程序遇到IO时,操作系统会将CPU的执行权限剥夺 优点:CPU的执行效率提高 当执行程序执行时间过长时,操作系统会将CPU的执行权限剥夺 缺点:程序的执行效率低 并发与并行 并发:是 伪并行 ,即看起来是同时运行。 单个CPU+多道技术 就可以实现并发 并行:同时运行,只有 具备多个CPU才能实现并行 无论是并行还是并发,在用户看来都是“同时”运行的。不管是进程还是线程,都只是一个任务而已,真正工作的只有CPU

从入门到进阶,这份完整的Python学习书籍单供你收藏

点点圈 提交于 2019-12-06 17:14:21
2018-01-08 小雨 小象 AlphaGo 都在使用的 Pytho n 语言,是最接近 AI 的编程语言。 教育部考试中心近日发布了“关于全国计算机等级(NCRE)体系调整”的通知,决定自2018年3月起,在全国计算机二级考试中加入了“Python语言程序设计”科目。 9个月前,浙江省信息技术课程改革方案已经出台,Python确定进入浙江省信息技术教材,从2018年起浙江省信息技术教材编程语言将会从vb更换为Python。 小学生都开始学Python了,天呐撸,学习Python看完这些准没错。 安利一波书单: Python入门 《Python编程快速上手——让繁琐工作自动化》 作者: 【美】Al Sweigart(斯维加特) Python3编程从入门到实践 亚马逊畅销Python编程图书 本书是一本面向实践的Python编程实用指南。本书不仅介绍了Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能。本书的第一部分介绍了基本Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们。第二部分的每一章都有一些项目程序,供读者学习。每章的末尾还提供了一些习题和深入的实践项目,帮助读者巩固所学的知识,附录部分提供了所有习题的解答。 《“笨办法”学Python(第3版)》 作者: 【美】Zed A. Shaw 《

小猪的Python学习之旅 —— 11.Python并发之threading模块(2)

ぐ巨炮叔叔 提交于 2019-12-06 16:55:41
一句话概括本文 : 本节继续把Python里 threading 线程模块剩下的 Condition , Semaphore , Event , Timer 和 Barrier 讲解完毕,文档是枯燥无味的,希望通过简单 有趣的例子,可以帮你快速掌握这几个东东的用法~ 啃文档是比较乏味的,先来个小姐姐提提神吧~ 别问高清原图,程序猿自己动手,丰(营)衣(养)足(跟)食(不上), 脚本自取: github.com/coder-pig/R… 引言 : 如果你忘记了threading上一部分内容,可以移步至: 小猪的Python学习之旅 —— 7.Python并发之threading模块(1) 温故知新,官方文档依旧是: docs.python.org/3/library/t… 1.条件变量(Condition) 上节学习了Python为我们提供的第一个用于线程同步的东东—— 互斥锁 , 又分 Lock(指令锁) 与 RLock(可重入锁) ,但是互斥锁只是最简单的同步机制, Python为我们提供了 Condition(条件变量) ,以便于处理复杂线程同步问题, 比如最经典的生产者与消费者问题。 Condition除了提供与Lock类似的**acquire() 与 release()**函数外,还提供了 **wait() 与 notify()**函数。用法如下: 1

python面试题及答案 2019

 ̄綄美尐妖づ 提交于 2019-12-06 16:54:13
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法. 正解1: def trim(s): while s[:1] == ' ': s = s[1:] while s[-1:] == ' ': s = s[:-1] return s 正解2: def trim(s): if s[:1] == ' ': s = trim(s[1:]) if s[-1:] == ' ': s = trim(s[:-1]) return s 容易写错的方法: def trim(s): while s[0] == ' ': s = s[1:] while s[-1] == ' ': s = s[:-1] return s 解释:当s=''时,s[0]和s[-1]会报IndexError: string index out of range,但是s[:1])和s[-1:]不会。 请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间. # -*- coding: utf-8 -*- import time, functools def metric(fn): @functools.wraps(fn) def wrapper(*args, **kw): time0 = time.time() ret = fn(*args, **kw)

python对比线程,进程,携程,异步,哪个快

蹲街弑〆低调 提交于 2019-12-06 13:59:22
目录 概念介绍 测试环境 开始测试 测试【单进程单线程】 测试【多进程 并行】 测试【多线程 并发】 测试【协程 + 异步】 结果对比 绘图展示 概念介绍 首先简单介绍几个概念: 进程和线程 进程就是一个程序在一个数据集上的一次动态执行过程(数据集是程序在执行过程中所需要使用的资源)。 线程也叫轻量级进程,它是一个基本的 CPU 执行单元,是比进程更小的能独立运行的基本单位。 进程和线程的关系: 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 资源分配给进程,同一进程的所有线程共享该进程的所有资源。 CPU 分给线程,即真正在 CPU 上运行的是线程。 并行和并发 并行处理是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面,其主要目的是节省大型和复杂问题的解决时间。 并发处理指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 CPU 上运行,但任一个时刻点上只有一个程序在 CPU 上运行。 并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。多进程是并行的,多线程是并发的。 同步和异步 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。

python-并发编程

久未见 提交于 2019-12-06 10:20:01
并发编程 并发(伪):由于执行速度特别快,人感觉不到 并行(真):创建10个人同时操作 线程 开销非常小 是操作系统可以调度的最小单位(内存共享) 能利用多个CPU 由操作系统控制 Cpython解释器下 由于GIL(全局解释器锁)的问题导致了一个进程中的多个线程无法利用多核 数据不安全 += -= *= /= 多个线程同时操作全局/内存外部的变量 需要自己加锁,在+= 操作前后添加lock.acquire()和lock.release()即可 append pop extend 你能想到的基础数据类型自带的方法都是数据安全的同时操作全局内存中的数据会产生数据的不安全 单进程,单线程的应用程序 print('666') 到底什么是线程?什么是进程 Python自己没有这玩意,Python中调用的操作系统的线程和进程(伪线程) 多线程 工作的最小单元 共享进程中所有资源 每个线程可以分担一点任务,最终完成最后的结果 python多线程原理:python的多线程实际是一个假的多线程(多个线程在1核CPU上运行,进行快速的切换导致错觉为同时执行) 代码 import threading def func(arg): print(arg) th = threading.Thread(target=func) th.start() print('end') 一个应用程序:软件