python多线程

python基础 — Queue 队列

允我心安 提交于 2019-12-06 16:27:06
queue介绍 queue是python中的标准库,俗称队列。 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性。 注意: 在python2.x中,模块名为Queue python3.x 为 queue queue模块有三种队列及构造函数: Python queue模块的FIFO队列 先进先出。 queue.Queue(maxsize) LIFO类似于堆,即先进后出。 queue.LifoQueue(maxsize) 还有一种是优先级队列级别越低越先出来。 queue.PriorityQueue(maxsize) queue模块中的常用方法 queue.get_nowait() 相当于queue.get(False) queue.put_nowait(item) 相当于queue.put(item, False) queue.get([block[, timeout]])获取队列,立即取出一个元素, timeout超时时间 queue.put(item[, timeout]]) 写入队列,立即放入一个元素, timeout超时时间 queue.join() 阻塞调用线程,直到队列中的所有任务被处理掉,

八、进程、线程和协程

≡放荡痞女 提交于 2019-12-06 16:24:13
     进程概念:进程,是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。即执行中的程序是进程,例如qq不是进程,当qq运行的时候,就是一个进程   线程概念:线程,有时被称为轻量级进程,是程序执行流的最小单元。可以理解为,线程是属于进程的,平时写的简单程序是单线程的,多线程和多线程的区别在于多线程可以同时处理多个任务。   进程之间的内存独立,而属于同一个进程多个线程之间的内存是共享的,多个线程可以直接对他们所在进程的内存数据进行读写并在线程间进行交换。   协程概念:协程是一种用户态的轻量级线程,如果说多进程对于多cpu,多线程对于多核cpu,那么事件驱动和协程则是在充分挖掘不断提高性能的单核cpu的潜力,既可以利用异步优势,又可以避免反复系统调用,还有进程切换造成的开销。协程也是单线程,但是它能让原来要使用异步+回调方式写的代码,可以用看似同步的方式写出来,他是实现推拉互动的所谓非抢占式协作的关键。对于python来说,由于python多线程中解释器导致的同时只能有一个线程访问cpu,所以对协程需求就相比其他语言更为紧迫。   多进程:多个任务,比如音乐,word等   多线程:在进程内部做多件事,即多个子任务,比如word里的打字、打印等同时进行   多任务实现的3种方式:   多进程模式   多线程模式   多进程

Python线程编程的两种方式

∥☆過路亽.° 提交于 2019-12-06 14:31:22
Python中如果要使用线程的话,python的lib中提供了两种方式。一种是函数式,一种是用类来包装的线程对象。举两个简单的例子希望起到 抛砖引 玉的作用,关于多线程编程的其他知识例如互斥、信号量、临界区等请参考python的文档及相关资料。 1、调用thread模块中的start_new_thread()函数来产生新的线程,请看代码: ### thread_example.py import time import thread def timer(no,interval): #自己写的线程函数 while True: print ‘Thread :(%d) Time:%s’%(no,time.ctime()) time.sleep(interval) def test(): thread.start_new_thread(timer,(1,1)) #使用thread.start_new_thread()来产生2个新的线程 thread.start_new_thread(timer,(2,3)) if __name__==’__main__’: test() 这个是 thread.start_new_thread(function,args[,kwargs]) 函数原型,其中 function参数是你将要调用的线程函数;args是讲传递给你的线程函数的参数

Python 多线程Ⅱ

我与影子孤独终老i 提交于 2019-12-06 13:58:59
线程模块 Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。 threading 模块提供的其他方法: threading.currentThread(): 返回当前的线程变量。 threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法: run(): 用以表示线程活动的方法。 start(): 启动线程活动。 join([time]): 等待至线程中止。这阻塞调用线程https://www.xuanhe.net/ Python 多线程 直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。 isAlive(): 返回线程是否活动的。 getName(): 返回线程名。 setName(): 设置线程名。 使用Threading模块创建线程 使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init_

并发编程----GIL,进程池/线程池

情到浓时终转凉″ 提交于 2019-12-06 12:38:40
GIL,进程池/线程池 GIL的全称是: Global Interpreter Lock,意思就是全局解释器锁,这个GIL并不是python的特性,他是只在Cpython解释器里引入的一个概念,而在其他的语言编写的解释器里就没有这个GIL例如: Jython,Pypy 为什么会有GIL: 随着电脑多核cpu的出现和cpu频率的提升,为了充分利用多核处理器,进行多线程的编程方式更为普及,随之而来的困难是线程之间数据的一致性和状态同步,而python也利用了多核,所以也逃不开这个困难,为了解决这个数据不能同步的问题,设计了GIL全局解释器锁 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全. 在一个python的进程内,不仅有test.py的主线程或者由该主线程开启的其他线程,还有解释器开启的垃圾回收等解释器级别的线程,总之,所有线程都运行在这一个进程内. 所有数据都是共享的,这其中,代码作为一种数据也是被所有线程共享的(est.py的所有代码以及Cpython解释器的所有代码).例如: test.py定义一个函数work(代码内容如下图),在进程内所有线程都能访问到work的代码,于是可以开启三个线程然后target都指向该代码,能访问到意味着就是可以执行. 所有线程的任务

并发编程----线程介绍

大兔子大兔子 提交于 2019-12-06 12:30:48
线程 一, 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 进程: 划分空间,加载资源,静态的 线程: 执行代码,执行能力,动态的 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位 线程是依赖于进程,一个进程可以包含多个线程,但是一定有一个主线程.线程才是CPU执行的最小单元 二, 线程与进程的区别 线程共享创建它的进程的地址空间; 进程有自己的地址空间 线程可以直接访问其进程的数据段(同进程内数据共享); 进程有自己的父进程数据段副本(数据隔离) 线程可以直接与其进程的其他线程通信;进程必须使用进程间通信与兄弟进程通信 新线程很容易创建(创建的开销很少,速度很快);新进程需要父进程的重复(需要开辟空间,复制资源,开销比开启线程多10-100倍) 线程可以对同一进程的线程进行相当大的控制; 进程只能对子进程进行控制 对主线程的更改(取消、优先级更改等)可能会影响进程的其他线程的行为; 对父进程的更改不会影响子进程. 三, 为什么要使用多线程 多线程指的是,在一个进程中开启多个线程,简单的讲: 如果多个任务共用一块地址空间,那么必须在一个进程内开启多个线程.详细的讲分为4点: 多线程共享一个进程的地址空间 线程比进程更轻量级,线程比进程更容易创建和撤销,在许多操作系统中

Python 多线程

强颜欢笑 提交于 2019-12-06 12:18:39
Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网https://www.xuanhe.net/zmn络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 开始学习Python线程 Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下: 参数说明:

python:协程的介绍

匆匆过客 提交于 2019-12-06 11:04:51
    cpu 正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制):   ​一种情况是该任务发生了阻塞;   另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它。 1、什么是协程?    协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到 I/O 自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换。 2、通过yield实现协程   上述第二种情况并不能提升效率,只是为了让 cpu 能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于 yield 来验证。 yield 本身就是一种在单线程下可以保存任务运行状态的方法   第一种情况的切换。在任务一遇到 io 情况下,切到任务二去执行,这样就可以利用任务一阻塞的时间完成任务二的计算,效率的提升就在于此。    yiled 可以保存状态, yield 的状态保存与操作系统的保存线程状态很像,但是 yield 是代码级别控制的,更轻量级    send 可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 import time def consumer(): while True: x=yield

python线程队列Queue-FIFO(35)

大兔子大兔子 提交于 2019-12-06 10:08:54
之前的文章中讲解很多关于线程间通信的知识,比如: 线程互斥锁lock , 线程事件event , 线程条件变量condition 等等,这些都是在开发中经常使用的内容,而今天继续给大家讲解一个更重要的知识点 — 线程队列queue。 一.队列分类: 1.线程队列Queue — FIFO(先进先出队列) ,即哪个数据先存入,取数据的时候先取哪个数据,同生活中的排队买东西 2.线程队列LifoQueue — LIFO(先进后出队列) ,即哪个数据最后存入的,取数据的时候先取,同生活中手枪的弹夹,子弹最后放入的先打出 3.线程队列PriorityQueue — PriorityQueue(优先级队列) ,即存入数据时候加入一个优先级,取数据的时候优先级最高的取出 今天只对第一种普通线程队列Queue(FIFO)讲解,后面的两种留到下一篇文章在做详细讲解! 二.先进先出队列Queue简介 线程队列Queue,也称FIFO,存在队列中的数据先进先出,就好比拉肚子,吃什么拉什么~~呃呃,有点重口味,如下图: 举个形象的例子:如果把123456这6个数字,依次放入队列queue中,那么我们重队列中取数据的时候,取到的第一个数据必然是1,第二个数据必然是2,依次类推,这就是所谓的吃什么拉什么 — FIFO(先进先出) 三.先进先出队列Queue常用函数 Queue.qsize()   返回队列大小

python 多线程实现循环打印 abc

风流意气都作罢 提交于 2019-12-06 07:03:53
python 多线程实现循环打印 abc 好久没写过python了, 想自己实践一下把 非阻塞版 import threading import time def print_a(): global value global lock global stop_flag while stop_flag: while True: if value == 0 or value == 3: break lock.acquire() value = 1 time.sleep(1) print("aaa") lock.release() def print_b(): global value global lock global stop_flag while stop_flag: while True: if value == 1: break lock.acquire() value = 2 time.sleep(1) print("bbb") lock.release() def print_c(): global value global lock global stop_flag while stop_flag: while True: if value == 2: break lock.acquire() value = 3 time.sleep(1) print("ccc")