python多线程并发

Python并发编程之多线程使用

瘦欲@ 提交于 2020-04-06 11:34:24
目录 一 开启线程的两种方式 二 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 三 练习 四 线程相关的其他方法 五 守护线程 六 Python GIL(Global Interpreter Lock) 七 同步锁 八 死锁现象与递归锁 九 信号量Semaphore 十 Event 十一 条件Condition(了解) 十二 定时器 十三 线程queue 十四 Python标准模块--concurrent.futures 一 开启线程的两种方式 ``` #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if name == ' main ': t=Thread(target=sayhi,args=('egon',)) t.start() print('主线程') 方式二 from threading import Thread import time class Sayhi(Thread): def init (self,name): super(). init () self.name=name def run(self): time.sleep(2) print('%s say hello' % self

并发编程-多线程,GIL锁

倾然丶 夕夏残阳落幕 提交于 2020-04-06 11:32:00
本章内容: 1.什么是GIL 2.GIL带来的问题 3.为什么需要GIL 4.关于GIL的性能讨论 5.自定义的线程互斥锁与GIL的区别 6.线程池与进程池 7.同步异步,阻塞非阻塞 一.什么是GIL 官方解释: ''' 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字节码,这个锁是非常重要的,因为CPython的内存管理非线程安全的,很多其他的特性依赖于GIL,所以即使它影响了程序效率也无法将其直接去除 总结: 在CPython中,GIL会把线程的并行变成串行

python学习——进程

两盒软妹~` 提交于 2020-03-31 02:56:48
1. 操作系统/应用程序 a. 硬件 - 硬盘 - CPU - 主板 - 显卡 - 内存 - 电源 ... b. 装系统(软件) - 系统就是一个由程序员写出来软件,该软件用于控制计算机的硬件, 让他们之间进行相互配合。 c. 安软件(安装应用程序) - QQ - 百度云 - pycharm ... 2. 并发和并行 并发,伪,由于一个人执行速度特别快,人感觉不到停顿。 并行,真,创建10个人同时操作。3. 线程、进程 a. 单进程、单线程的应用程序 print('666') b. 到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程。 c. 单进程、多线程的应用程序 代码: import threading print('666') def func(arg): print(arg) t = threading.Thread(target=func) t.start() print('end') 一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个)。 d. 故事: Alex甄嬛西游传 总结: 1. 操作系统帮助开发者操作硬件。 2. 程序员写好代码在操作系统上运行(依赖解释器)。 任务特别多的情况: 3. 以前的你,写代码: import threading import requests

Python 中的协程 (3) 基础概念

戏子无情 提交于 2020-03-25 15:36:58
1 进程和线程 进程 Process:一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式)。 线程 Thread: 线程是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。线程的本质:线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 进程和线程的区别:进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些

python并发编程之多进程理论部分

本小妞迷上赌 提交于 2020-03-23 05:41:13
内容概要 操作系统介绍 进程 线程 协程 二. 进程 python并发编程之多进程理论部分 在python程序中的进程操作   运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建子进程。多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快。创建进程这个功能需要借助python中强大的模块。 multiprocess模块   multiprocess不是一个模块而是python中一个操作、管理进程的包。 这个包中几乎包含了和进程有关的所有子模块。大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。 multiprocess.process模块 process模块介绍   process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。 class Process(object): def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): self.name = '' self.daemon = False self.authkey = None self.exitcode = None self.ident = 0

线程池python

跟風遠走 提交于 2020-03-23 00:46:45
为什么需要线程池   目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。   传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“ 即时创建, 即时销毁 ”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是 如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态 。   我们将传统方案中的线程执行过程分为三个过程:T1、T2、T3:   T1:线程创建时间   T2:线程执行时间,包括线程的同步等时间   T3:线程销毁时间   那么我们可以看出,线程本身的开销所占的比例为(T1+T3) / (T1+T2+T3)。如果线程执行的时间很短的话,这比开销可能占到20%-50%左右。如果任务执行时间很频繁的话,这笔开销将是不可忽略的。   除此之外,线程池能够减少创建的线程个数。通常线程池所允许的并发线程是有上界的,如果同时需要并发的线程数超过上界,那么一部分线程将会等待。而传统方案中,如果同时请求数目为2000,那么最坏情况下,系统可能需要产生2000个线程。 尽管这不是一个很大的数目,但是也有部分机器可能达不到这种要求。   

python细节1

自古美人都是妖i 提交于 2020-03-21 18:47:28
并发:交替处理多个任务的能力 并行:同时处理多个任务的能力 1. GIL 全局解释器锁 作用:保证同一时刻只有一个线程使用cpu 效果:一个进程中只有一个gil,多个线程需要去抢夺GIl,没有办法真正的使用多个cpu。 注意:GIL存在于cpyhton解释器中的 多线程使用情况: 1 科学计算 单线程比较快 2 i/o操作 多线程比较快 2. 深拷贝和浅拷贝 copy.copy()浅拷贝 copy.deepcopy()深拷贝 在拷贝简单的数据类型 (a = [1,2]) 的时候没有区别 都是开辟新的一片空间存储数据 拷贝有嵌套的数据类型 浅拷贝 仅仅是拷贝了引用 没有办法保证数据的独立性 深拷贝 完全拷贝数据 并且开辟空间 保证数据的独立性 拷贝元组(不可变类型的数据)的时候 深拷贝和浅拷贝是一样的 不开辟新的空间 直接引用 如果不可变类型 比如元组中 有可变类型的数据 深拷贝:保证数据的独立性 浅拷贝:直接引用 切片拷贝,字典拷贝都是浅拷贝 3. 私有化 私有属性是通过 名字重整 进行保护的 01 父类中属性名为__名字的,子类不继承,子类不能访问 02 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性 03 _名的变量、函数、类在使用from xxx import *时都不会被导入 4.import搜索路径:sys.path 模块重写后,需要重新导入

python17 多线程学习

喜夏-厌秋 提交于 2020-03-21 18:43:14
多线程 多任务可以由多进程完成,也可以由一个进程内的多线程完成。 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外, 并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。 Python的标准库提供了两个模块: _thread 和 threading , _thread 是低级模块, threading 是高级模块,对 _thread 进行了封装 。绝大多数情况下,我们只需要使用 threading 这个高级模块。 启动一个线程就是把一个函数传入并创建 Thread 实例,然后调用 start() 开始执行: import time, threading # 新线程执行的代码: def loop(): print('thread %s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print('thread %s >>> %s' % (threading.current_thread().name, n)) time.sleep(1) print('thread %s ended.' % threading.current_thread

python学习笔记-41 多线程

泄露秘密 提交于 2020-03-21 18:42:52
多任务可以由多进程完成,也可以由一个进程内的多线程完成。 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。 Python的标准库提供了两个模块: _thread 和 threading , _thread 是低级模块, threading 是高级模块,对 _thread 进行了封装。绝大多数情况下,我们只需要使用 threading 这个高级模块。 启动一个线程就是把一个函数传入并创建 Thread 实例,然后调用 start() 开始执行: import time, threading # 新线程执行的代码: def loop(): print('thread %s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print('thread %s >>> %s' % (threading.current_thread().name, n)) time.sleep(1) print('thread %s ended.' % threading.current_thread()

Python之线程

心已入冬 提交于 2020-03-17 06:34:56
为什么需要线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 什么是线程 线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元,也是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 线程与进程的区别: 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)