python多线程并发

Python并发编程04/多线程

心不动则不痛 提交于 2019-11-28 09:40:12
目录 Python并发编程04/多线程 1.生产消费者模型 2.线程的理论知识 2.1什么是线程 2.2线程vs进程 2.3线程的应用 3.开启进程的两种方式 3.1第一种方式 3.2第一种方式 4.线程vs进程的代码对比 4.1开启速度对比 4.2对比pid 4.3同一个进程内线程共享内部数据 5.线程的其他方法 6.join与守护线程 6.1join 6.2守护线程 7.互斥锁 Python并发编程04/多线程 1.生产消费者模型 #编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后你遇到类似的情况,套用即可. 生产者消费者模型三要素: # 生产者: 产生数据的 # 消费者: 接收数据做进一步处理的 # 容器: 盆(队列) 队列容器的作用: #起到缓冲的作用,平衡生产力与消费力,解耦. # from multiprocessing import Process # from multiprocessing import Queue # import time # import random # # def producer(q,name): # for i in range(1,6): # time.sleep(random.randint(1,2)) # res = f'{i}号包子' # q.put(res) # print(f'生产者{name} 生产了

python ---- 多线程

一曲冷凌霜 提交于 2019-11-28 08:38:56
线程,多线程: 线程的理论知识: 什么是线程: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。 在内存中开启一个进程空间,然后将主进程的所有的资源数据复制一份,然后去调用线程去执行代码。 进程是资源单位,线程是执行单位 线程vs进程: 启动进程的开销非常大,比开启线程的开销大很多 开启线程的速度非常快, 线程与线程之间可以共享数据,进程与进程之间需要借助队列等方法实现通信。 from threading import Thread x = 3 def task ( ) : global x x = 10 if __name__ == '__main__' : t1 = Thread ( target = task ) t1 . start ( ) t1 . join ( ) print ( x ) # x 的值是10,所以在线程中,是可以做到数据共享的 同一进程内的资源数据对于这个进程的多个线程来说是共享的. 线程的应用: 并发:一个cup看起来像是同时执行多个任务 开启线程的两种方式: from threading import Thread # 导入线程的模块 import time import random def task (

【Python与线程】

偶尔善良 提交于 2019-11-28 07:39:46
原文: 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进阶(4)

一世执手 提交于 2019-11-28 07:18:34
python进阶(4) 线程 线程的注意点 子线程之间共享全局变量,就会造成资源的争抢问题 互斥锁的问题 问题: 因为线程之间共享全局变量,所以,在多线程几乎在同时运行的时候,几乎同时修改同一全局变量的时候没,就要进行控制 此时,需要互斥锁 当某个线程需要修改资源的时候,先将资源进行锁定,其他线程不能修改该线程 当线程修改完成之后,并且释放完互斥锁之后,其他的线程才可以使用 互斥锁保证当前只有一个线程可以使用修改同一个资源 import threading num = 0 def add_num1 ( ) : global num for i in range ( 10000000 ) : lock . acquire ( True ) num += 1 lock . release ( ) print ( '子线程1已经完成,此时得到的num1' , num ) def add_num2 ( ) : global num for i in range ( 10000000 ) : lock . acquire ( ) num += 1 lock . release ( ) print ( '子线程2已经完成,此时得到的num2' , num ) if __name__ == '__main__' : lock = threading . Lock ( ) thread1 =

python的进程与线程

我与影子孤独终老i 提交于 2019-11-28 06:25:42
进程、线程的含义? 1.什么是进程?   进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。多进程就是“多任务”,就像使用电脑时同时打开浏览器上网、打开播放器听歌、后台还默默运行着杀毒软件一样。现代操作系统如Mac OS X,UNIX,Linux,Windows等都支持多进程,每启动一个进程,操作系统便为该进程分配一个独立的内存空间。 2.什么是线程?   线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以有一个线程,也可以有多个线程。   线程自己不拥有独立的系统资源,只拥有一点在运行中必不可少的资源,它可与同属一个进程的其它线程共享当前进程所拥有的全部资源。   一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。   线程有就绪(runnable)、阻塞(blocked)和运行(running)三种基本状态以及新建(new)和死亡(dead)状态。 为什么要有多进程和多线程?   每个进程至少要干一件事,比如一个编辑器既要打字输入同时又要检测打错的拼写有时候还要区分一些关键字高亮显示,它们同属于编辑器这个进程,我们把编辑器作为一个进程

python中重要的模块--asyncio

本小妞迷上赌 提交于 2019-11-28 06:24:32
asyncio 是python3增加的特性。不过backport到了2.7了。 python 2.7 Develop with asyncio Tasks and coroutines python 3.7 asyncio (org CN ) REF: 一份详细的asyncio入门教程 有大量的例子 python中重要的模块--asyncio 不同线程的事件循环 很多时候,我们的事件循环用于注册协程,而有的协程需要动态的添加到事件循环中。一个简单的方式就是使用多线程。 当前线程创建一个事件循环 ,然后在新建一个线程,在新线程中启动事件循环。 当前线程不会被block 。 详解python异步编程之asyncio(百万并发) 介绍 aiohttp Python异步IO编程之-asyncio协程应用例子 如何真正运行一个协程呢?asyncio 提供了三种机制: (1)asyncio.run() 函数,这是异步程序的主入口,相当于C语言中的main函数。 (2)用await等待协程,比如上例中的 await asyncio.sleep(1) 。再看下面的例子,我们定义了协程 say_delay() ,在main()协程中调用两次,第一次延迟1秒后打印“你好”,第二次延迟2秒后打印“猿人学”。这样我们通过 await 运行了两个协程。 从起止时间,多个协程是 顺序执行 的 (3)通过

你是否真的了解全局解析锁(GIL)

杀马特。学长 韩版系。学妹 提交于 2019-11-28 06:15:31
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。 Github: https://github.com/hylinux1024 微信公众号:终身开发者(angrycode) 0x00 什么是全局解析锁(GIL) A global interpreter lock (GIL) is a mechanism used in computer-language interpreters to synchronize the execution of threads so that only one native thread can execute at a time. -- 引用自wikipedia 从上面的定义可以看出, GIL 是计算机语言解析器用于同步线程执行的一种 同步锁机制 。很多编程语言都有 GIL ,例如 Python 、 Ruby 。 0x01 为什么会有GIL Python 作为一种面向对象的动态类型编程语言,开发者编写的代码是通过解析器顺序解析执行的。 大多数人目前使用的 Python 解析器是 CPython 提供的,而 CPython 的解析器是 使用引用计数来进行内存管理 ,为了对多线程安全的支持,引用了 global intepreter

python_高级进阶(3)线程

半腔热情 提交于 2019-11-28 06:10:36
线程 进程只是用来把资源集中到一起(进程只是一个资源单位), 而线程才是cpu上的执行单位。 线程的好处 开启进程的开销非常大,比开启线程的开销大很多. 开启线程的速度非常快.要快几十倍到上百倍. 线程线程之间可以共享数据,进程与进程之间需借助队列等方法实现通信. 线程的应用 该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字, 定时自动将文字保存到硬盘,这三个任务操作的都是同一块数据, 因而不能用多进程。只能在一个进程里并发地开启三个线程,如果是单线程, 那就只能是,键盘输入时,不能处理文字和自动保存,自动保存时又不能输入和处理文字。 开启线程两种方式 方式一 # 第一种方式 # from threading import Thread # import time # # def task(name): # print(f'{name} is running') # time.sleep(1) # print(f'{name} is gone') # # # # if __name__ == '__main__': # # t1 = Thread(target=task,args=('A',)) # t1.start() # print('===主线程') # 线程是没有主次之分的. 方式二 from threading import Thread # import

快速了解Python并发编程的工程实现(下)

点点圈 提交于 2019-11-28 04:13:53
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。 Github: https://github.com/hylinux1024 微信公众号:终身开发者(angrycode) 0x00 使用进程实现并发 上一篇文章 介绍了线程的使用。然而 Python 中由于 Global Interpreter Lock (全局解释锁 GIL )的存在,每个线程在在执行时需要获取到这个 GIL ,在同一时刻中只有一个线程得到解释锁的执行, Python 中的线程并没有真正意义上的并发执行,多线程的执行效率也不一定比单线程的效率更高。 如果要充分利用现代多核 CPU 的并发能力,就要使用 multipleprocessing 模块了。 0x01 multipleprocessing 与使用线程的 threading 模块类似, multipleprocessing 模块提供许多高级 API 。最常见的是 Pool 对象了,使用它的接口能很方便地写出并发执行的代码。 from multiprocessing import Pool def f(x): return x * x if __name__ == '__main__': with Pool(5) as p: #

4.并发编程多线程

会有一股神秘感。 提交于 2019-11-28 02:40:22
并发编程之多线程(理论) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 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=('太白',)) 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.name) if __name__ == '__main__': t = Sayhi(