python多线程并发

学习Python语言,需要先了解一下Python有什么优缺点?

好久不见. 提交于 2019-11-27 16:44:08
Python语言拥有诸多的优点,这其中,以下几个优点特别显著: 简单易学:Python语言相对于其他编程语言来说,属于比较容易学习的一门编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。正是因为Python语言简单易学,所以,已经有越来越多的初学者选择Python语言作为编程的入门语言。例如,在浙江省2017年高中信息技术改革中,《算法与程序设计》课程将使用Python语言替换原有的VB语言。 语法优美:Python语言力求代码简洁、优美。在Python语言中,采用缩进来标识代码块,通过减少无用的大括号,去除语句末尾的分号等视觉杂讯,使得代码的可读性显著提高。阅读一段良好的Python程序就感觉像是在读英语一样,它使你能够专注于解决问题,而不用太纠结编程语言本身的语法。 丰富强大的库:Python语言号称自带电池(BatteryIncluded),寓意是Python语言的类库非常的全面,包含了解决各种问题的类库。无论实现什么功能,都有现成的类库可以使用。如果一个功能比较特殊,标准库没有提供相应的支持,那么,很大概率也会有相应的开源项目提供了类似的功能。合理使用Python的类库和开源项目,能够快速的实现功能,满足业务需求。 开发效率高:Python的各个优点是相辅相成的。例如,Python语言因为有了丰富强大的类库,所以,Python的开发效率能够显著提高。相对于C、C+

【Python与线程】 -- 2019-08-16 21:05:44

别说谁变了你拦得住时间么 提交于 2019-11-27 13:51:50
原文: http://blog.gqylpy.com/gqy/232 " 目录 一、全局解释器锁GIL 二、Python线程模块的选择 三、线程的创建 三、锁机制 四、信号量 五、事件 六、条件 七、定时器 八、线程队列 九、线程池 补充:线程安全 import threading obj = threading.local()# local():可实现,多线程操作某一数据,不会出现数据混乱的情况# 原理:空间换时间 def add(i): obj.n = i print(i, obj.n, threading.current_thread().ident) for i in range(20): th = threading.Thread(target=add, args=(i,)) th.start() 一、全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中同时只有一个线程在执行。虽然Python解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行. 对于Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁保证了同一时刻只有一个线程在运行. 同一时间点,GIL只允许同一个进程中的一个线程访问cpu,即CPython解释器中没有真正的线程并行,只有进程可以实现。故I

python线程

本秂侑毒 提交于 2019-11-27 13:31:11
基本概念 1.进程 定义:   进程就是一个程序在一个数据集上的一次动态执行过程。    组成: 进程一般由程序、数据集、进程控制块三部分组成。    程序: 我们编写的程序用来描述进程要完成哪些功能以及如何完成;    数据集:  则是程序在执行过程中所需要使用的资源;    进程控制块:  用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志 2.线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。   线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元   组成: 由线程ID、程序计数器、寄存器集合和堆栈共同组成。   线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源 3.线程与进程的区别 线程是执行的指令集 , 进程是资源的集合 线程的启动速度要比进程的启动速度要快 两个线程的执行速度是一样的 进程与线程的运行速度是没有可比性的 线程共享创建它的进程的内存空间 , 进程的内存是独立的 两个线程共享的数据都是同一份数据 , 两个子进程的数据不是共享的 , 而且数据是独立的 同一个进程的线程之间可以直接交流 , 同一个主进程的多个子进程之间是不可以进行交流 , 如果两个进程之间需要通信 ,

【Python与线程】 -- 2019-08-16 18:48:53

谁说胖子不能爱 提交于 2019-11-27 13:31:03
原文: http://blog.gqylpy.com/gqy/232 " 目录 一、全局解释器锁GIL 二、Python线程模块的选择 三、线程的创建 三、锁机制 四、信号量 五、事件 六、条件 七、定时器 八、线程队列 九、线程池 补充:线程安全 import threading obj = threading.local()# local():可实现,多线程操作某一数据,不会出现数据混乱的情况# 原理:空间换时间 def add(i): obj.n = i print(i, obj.n, threading.current_thread().ident) for i in range(20): th = threading.Thread(target=add, args=(i,)) th.start() 一、全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中同时只有一个线程在执行。虽然Python解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行. 对于Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁保证了同一时刻只有一个线程在运行. 同一时间点,GIL只允许同一个进程中的一个线程访问cpu,即CPython解释器中没有真正的线程并行,只有进程可以实现。故I

【Python与线程】 -- 2019-08-16 18:41:41

爷,独闯天下 提交于 2019-11-27 13:29:21
原文: http://blog.gqylpy.com/gqy/232 " 目录 一、全局解释器锁GIL 二、Python线程模块的选择 三、线程的创建 三、锁机制 四、信号量 五、事件 六、条件 七、定时器 八、线程队列 九、线程池 补充:线程安全 import threading obj = threading.local()# local():可实现,多线程操作某一数据,不会出现数据混乱的情况# 原理:空间换时间 def add(i): obj.n = i print(i, obj.n, threading.current_thread().ident) for i in range(20): th = threading.Thread(target=add, args=(i,)) th.start() 一、全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中同时只有一个线程在执行。虽然Python解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行. 对于Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁保证了同一时刻只有一个线程在运行. 同一时间点,GIL只允许同一个进程中的一个线程访问cpu,即CPython解释器中没有真正的线程并行,只有进程可以实现。故I

python学习第12天笔记

余生颓废 提交于 2019-11-27 12:00:32
1 并发编程 1.1 概念 1.1.1 并发编程 同步执行多个任务 注:对于单核CPU,并不能实现真正意义的并发编程 1.2 进程 一个程序的运行实例 每个进程有自己的地址空间、内存、数据栈及辅助数据 1.3 线程 同一进程内,可被并行激活的控制流 共享相同的上下文(空间地址、数据结构) 特点:便于信息的共享和通信 线程执行顺序的差异可能导致不同的结果 1.4 python全局解释器(GIL) 特点:代码由虚拟机(解释器主循环)控制 主循环同时只能有一个控制线程执行 解释器特性而非python语言特性 注:对于数据密集型,可以采用C等语言处理,或采用多进程,而对于I/O密集密集型,则不需要 2 多线程 2.1 _thread模块 2.1.1 特点 没有控制进程结束机制 只有一个同步原语 注:下划线开头代表这个模块已经不推荐使用 2.1.2 语法 import _thread _thread.start_new_thread(function,args,**kwargs=none) 其中function为线程要执行的函数,args为函数的参数,参数需要以元组的格式写 2.2 .threading模块 2.2.1 构造线程 threading.thread(target=函数,agrs=参数) 注:还有一个办法是自定义thread派生类,重写其中的run方法 2.2.2 线程中的方法

Python之进程与线程

蓝咒 提交于 2019-11-27 10:55:45
进程和线程 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 Python既支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。 Python中的多进程 没有用多进程: 1 from random import randint 2 from time import time, sleep 3 4 5 def download_task(filename): 6 print('开始下载%s...' % filename) 7 time_to_download = randint(5, 10) 8 sleep(time_to_download) 9 print('%s下载完成! 耗费了%d秒' % (filename, time_to_download)) 10 11 12 def main(): 13 start = time()

python day33

江枫思渺然 提交于 2019-11-27 10:25:33
今日内容 进程池与线程池 开进程和开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比进程要少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但是保证了计算机的硬件的安全 (硬件的发展跟不上软件的发展速度) 线程池 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os ​ pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程内的线程个数,也可以不传,不传默认是当前所在计算机的cpu个数乘5 pool = ProcessPoolExecutor(5) ​ def task(n): print(n) time.sleep(2) return n**2 ​ t_list = [] for i in range(20): res = pool.submit(task,1) # 朝线程池中提交任务,异步提交 print(res.result()) # 原地等待任务的返回结果,将并发变为串行 t_list.append() ​ pool.shutdown() # 关闭池子,等待池子中所有的任务执行完毕后,才会往下运行代码 for p

python进程/线程/协成

风格不统一 提交于 2019-11-27 08:50:32
1.谈谈对多进程多线程以及协成的理解 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫做程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大 线程:调度执行的最小单位,也叫执行路径,不能独立存在,必须依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协成:是一种用户太的轻量级线程,协成的调度完全由用户控制,协成拥有自己的寄存器上下文和栈.协成调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快2.什么是多线程竞争? 线程是独立的,同一进程里数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎被多个线程占用,造成数据混乱,即所谓线程不安全 如何解决多线程竞争问题?锁 锁的好处? 确保了某段关键代码(共享数据资源)只能由一个线程从头到 尾完整弟执行能够解决多线程资源竞争下的原子操作问题 锁的坏处? 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程 模式执行,效率就大大地下降了3.什么是锁?有哪几种锁? 锁(Lock)是python提供的队线程控制的对象, 互斥锁 可重入锁 死锁4.什么是死锁? 若干子线程在资源竞争时

线程

為{幸葍}努か 提交于 2019-11-27 08:22:19
[多线程](https://www.cnblogs.com/linhaifeng/articles/7428877.html) [FTP](https://www.cnblogs.com/xiao-apple36/p/9415237.html) [FTP代码](https://www.cnblogs.com/xiao-apple36/p/9393411.html) 多进程多线程的join和队列的join是不一样的 进程队列 q=multiprocess.Queue() 多个进程之间能通信(不建议,一般用管道实现进程间通信) 线程队列 q=queue.Queue() 多个线程之间能通信 多进程同步中的Lock ,需要传给Process 多线程的 ### 进程线程的特点 1. 每个进程都有自己 独立的 内存地址 2. 线程之间的切换 相对于 进程之间切换 更为方便,代价也更低。 3. 对于IO密集型的任务,使用多线程还是能提高一下CPU使用率。 4. 对于CPU密集型的任务,Python中的多线程其实是个鸡肋……没卵用……在Python的解释器CPython中存在一个互斥锁。简单来讲就是同一时间只能有一个线程在执行,其它线程都处于block模式。 5. 要想在py中充分利用多核cpu,就只能用多进程了。虽然代价高了些,但是比起并行计算带来的性能提升这些也微不足道了。 *