python多线程

python多线程

若如初见. 提交于 2020-03-21 18:43:47
一、threading   多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,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

[Python] 多线程相关

落花浮王杯 提交于 2020-03-21 09:48:33
3 月,跳不动了?>>> 1 相关基础 Python3 线程中常用的两个模块为: _thread threading(推荐使用) thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。 1.1 _thread 模块函数式调用 _thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: _thread.start_new_thread ( function, args[, kwargs] ) 参数说明: function - 线程函数。 args - 传递给线程函数的参数,他必须是个tuple类型。 kwargs - 可选参数。 1.2 threading 模块对象式调用 threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法。 除了使用函数外,线程模块同样可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程。 import threading import time

并发编程之多线程

主宰稳场 提交于 2020-03-18 22:51:00
一,什么是线程   在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程   线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。   所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。   多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。例如,北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。 二,线程和进程的区别 Threads share the address space of the process that created it; processes have their own address space. Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent

死磕 java线程系列之线程模型

北慕城南 提交于 2020-03-18 07:24:11
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“ 用户线程 ”,而对应到操作系统,还有另外一种线程叫作“ 内核线程 ”。 用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。 最终,用户线程和内核线程之间必然存在某种关系,本章我们一起来学习下建立这种关系常见的三种方法:多对一模型、一对一模型和多对多模型。 多对一模型 多对一线程模型,又叫作用户级线程模型,即多个用户线程对应到同一个内核线程上,线程的创建、调度、同步的所有细节全部由进程的用户空间线程库来处理。 优点: 用户线程的很多操作对内核来说都是透明的,不需要用户态和内核态的频繁切换,使线程的创建、调度、同步等非常快; 缺点: 由于多个用户线程对应到同一个内核线程,如果其中一个用户线程阻塞,那么该其他用户线程也无法执行; 内核并不知道用户态有哪些线程,无法像内核线程一样实现较完整的调度、优先级等; 许多语言实现的协程库基本上都属于这种方式,比如python的gevent。 一对一模型 一对一模型,又叫作内核级线程模型

Netty题目总结

蓝咒 提交于 2020-03-17 08:59:05
1.BIO、NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用 器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去 启动线程进行处理, BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO 的 Stream 是单向的,而 NIO 的 channel 是双向的。 NIO的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再阻塞,而是返 回 0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用 大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。 在 Reactor 模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发 器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操 作。如在 Reactor 中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事 件、事件到来

python多线程和GIL全局解释器锁

让人想犯罪 __ 提交于 2020-03-16 06:36:55
1、线程 线程被称为轻量级进程,是最小执行单元,系统调度的单位。线程切换需要的资源一般,效率一般。 2、多线程 在单个程序中同时运行多个线程完成不同的工作,称为多线程 3、并发: 操作系统同时执行几个程序,这几个程序都由一个cpu处理,但在一个时刻点上只有一个程序在cpu上处理 4、并行: 操作系统同时执行2个程序,但是有两个cpu,每个cpu处理一个程序,叫并行 5、串行: 是指的我们从事某项工作是一个步骤一个步骤去实施 一、多线程 #python3是假的多线程,它不是真真正正的并行,其实就是串行,只不过利用了cpu上下文的切换而已 1 mport threading 2 import time 3 # def test1(): 4 # for i in range(10): 5 # time.sleep(1) #睡1s 6 # print('test1=========>%s' % i) 7 # 8 # 9 # def test2(): 10 # for i in range(10): 11 # time.sleep(1) 12 # print('test2=========>%s' % i) 13 # 14 # t1 = threading.Thread(target=test1) #定义一个线程 target=函数名 15 # t2 = threading.Thread

线程、进程、协程概念辨析

ε祈祈猫儿з 提交于 2020-03-11 16:26:49
线程和进程 线程、进程经常放在一起对比: 《线程||进程||行程||多线程||多进程一次搞清》 《IO密集型任务(多线程)||计算密集型(多进程)》 线程 是最小单位, 进程 内至少包含一个 线程 。 对操作系统来说, 线程 是最小的执行单元, 进程 是最小的资源管理单元。 进程 间的切换(涉及栈、寄存器、虚拟内存、文件句柄等)开销较大,但是相对安全; 不同进程 通过进程间通讯来通信。 线程 是比进程更小的、CPU调度和分派的、能独立运行的基本单位,可与同属一个进程的其他的线程共享进程所拥有的全部资源; 线程间 通信主要通过 共享内存 。 协程概念 协程 ,英文名***Coroutine***。 协程 是一种用户态的轻量级线程,协程的调度完全由用户控制,拥有自己的寄存器上下文和栈。 一台机器只执行一个程序太浪费CPU资源了,当某个程序执行IO时就让出CPU资源交给另一个程序执行,这就是 协程的思想 。 协程是实现异步的一种方式。 从编程角度,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume)机制。 协程与线程/进程的区别 编译器与操作系统 协程 是 编译器 级的,Process和Thread是 操作系统级 的。 操作系统级的意思是对算法的调度是通过OS执行的,每次跑到OS分配的CPU时间后就会被OS强制挂起,开发者无法精确控制他们。 Coroutine

【11.4】协程是什么?

本秂侑毒 提交于 2020-03-11 06:47:26
协程--可以暂停的函数(可以向暂停的地方传入值) 协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。 子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。比如子程序A、B: 1 def A(): 2 print '1' 3 print '2' 4 print '3' 5 6 def B(): 7 print 'x' 8 print 'y' 9 print 'z' 假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是: 1 1 2 2 3 x 4 y 5 3 6 z 但是在A中是没有调用B的,所以协程的调用比函数调用理解起来要难一些。 看起来A、B的执行有点像多线程,但协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

pythonの多线程

↘锁芯ラ 提交于 2020-03-10 11:55:30
python的GIL 在非python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。 在python中,无论有多少核,同时只能执行一个线程,这是由于GIL所导致的。 GIL(Global Interpreter Lock全局解释器锁),是为了数据安全所做的决定,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”。 在一个python进程中,GIL只有一个 拿不到GIL的线程,就不允许进入CPU执行 GIL的释放逻辑 python2.x中,在线程遇见IO操作或者ticks计数达到100时进行释放(ticks是python自身的一个计数器,专门用于做GIL,每次释放后归零,这个计数可以通过sys.setcheckinterval来调整) python3.x中,改为使用计时器(当执行时间达到阈值后,当前线程释放GIL) 释放GIL锁后,线程会进行锁竞争,随后切换线程,会消耗资源 由于python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),所以在多核CPU上,python的多线程效率并不高 python多线程工作过程 1.拿到公共数据 2.申请GIL 3.python解释器调用os原生线程 4.os操作cpu执行运算 5.当该线程达到gil的释放要求时,无论运算是否已经执行完,gil都被要求释放 6.其他线程重复上面的过程

python多线程机制

时间秒杀一切 提交于 2020-03-10 11:28:11
Python中的线程从一开始就是操作系统的原生线程。而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用。 GIL与线程调度   为了理解Pyhon为什么需要GIL,考虑这样的情形:假设有两个线程A B,在两个线程中,都同时保存着对内存中同一对象obj的引用,也就是说,这事obj->ob_refcnt的值为2.如果A销毁对obj的引用,显然,A将通过Py_DECREF调整obj的引用计数值。外面知道,py_DECREF的整个动作可以分为两个部分:   --obj ->ob_refcnt;   if(obj->ob_refcnt == 0) destory object and free memory.   如果A执行完第一个动作后,obj->ob_refcnt的值变为1,不幸的是,在这里时候线程调度机制将A挂起,唤醒了B。更为不幸的是,B同样也开始销毁对obj的引用。B完成第一个动作后,obj ->ob_refcnt为0,B是一个幸运儿,它没有被线程调度打断,而是顺利完成了接下来的第二个动作,将对象销毁,内存释放。好了吗,现在A又被重新唤醒,可现在已是物是人非,obj ->ob_refcnt已经被B减少到0,而不是当时的1.按照约定,A开始在一次地对已经销毁的对象进行对象销毁的内存释放动作