python多线程并发

python 并发编程-- 多进程

风格不统一 提交于 2019-12-23 04:34:17
一 multiprocessing 模块介绍      python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程   Python提供了multiprocessing。  multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。    multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。  需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。 二 Process类的介绍 from multiprocessing import Process Process([group[,target[,name[,args[,kwargs]]]]]) 由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)强调:1.需要使用关键字的方式来指定参数2.args 指定的为传给 target(目标,对象) 函数的位置参数,是一个元祖形式,必须有逗号参数介绍:1.group 参数未使用,值始终设计 None2.target 表示调用对象,即子进程要执行的任务3.args

python支持的进程与线程

烂漫一生 提交于 2019-12-22 18:11:53
一、multiprocessing模块介绍 python中的多线程无法利用CPU资源,在python中大部分情况使用多进程。python中提供了非常好的多进程包 multiprocessing。 multiprocessing 模块用来开启子进程,并在子进程中执行功能(函数),该模块与多线程模块threading的编程接口类似。 multiprocessing 的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 二、Process类的介绍 1.创建进程的类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) 强调: 1. 需要使用关键字的方式来指定参数 2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号 2.参数介绍 1 group参数未使用,值始终为None 2 3 target表示调用对象,即子进程要执行的任务 4 5 args表示调用对象的位置参数元组,args=(1,2,'egon',) 6 7 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} 8 9 name为子进程的名称 3.方法介绍 1 p.start(

Python 线程 进程和协程

孤人 提交于 2019-12-21 03:42:36
python线程 线程的创建 多线程类似于同时执行多个不同程序,多线程有以下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理 程序的运行速度可能加快 在一些IO密集型操作中,线程就比较有用。可以释放上些内存占用 python3中使用Threading模块提供线程相关的操作。 #!/usr/bin/env python3 import threading import time class Mythread(threading.Thread): def __init__(self, func, arg): threading.Thread.__init__(self) self.func = func self.arg = arg def run(self): self.func(self.arg) def f1(x): time.sleep(1) print(x) if __name__ == '__main__': for i in range(10): t = Mythread(f1, i) t.start() 上面的代码创建了十个线程,然后提交给CPU,让CPU根据指定算法去调度执行。 getName 获取线程名 setNmae 设置线程名 setDaemon 设置线程为前台还是后台,如果线程是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后

python进程和线程

情到浓时终转凉″ 提交于 2019-12-20 10:04:33
引入进程和线程的概念及区别 1、线程的基本概念 概念 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 ************************ 好处 (1)易于调度。 (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 (3)开销少。创建线程比创建进程要快,所需开销很少 2、进程的基本状态及状态之间的关系 状态:运行、阻塞、挂起阻塞、就绪、挂起就绪 状态之间的转换: (1)准备就绪的进程,被CPU调度执行,变成运行态; (2)运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态; (3)运行中的进程,进程执行完毕(或时间片已到),变成就绪态; (4)将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态; (5)将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态; 3、线程和进程的关系以及区别? ** 进程和线程的关系:** (1

python学习第12天笔记

房东的猫 提交于 2019-12-20 06:43:11
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-12-19 09:48:57
一、介绍 什么是并发? 并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 1.任务发生阻塞 2.计算任务时间过长,需要让出cpu给高优先级的程序 协程,又称微线程,是一种用户态的轻量级线程。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置,当程序中存在大量不需要CPU的操作时(IO),适用于协程。 协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换 进程有三种状态,而线程是进程的执行最小单位,所以也是线程的三种状态 二、协程切换 1.yield是一种在单线程下可以保存任务运行状态的方法 1. yiled 可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 2. send 可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 通过yield实现任务切换+保存线程: import time def func1(): for i in range(11): print('func1第%s次打印' % i) time

Python语言

爱⌒轻易说出口 提交于 2019-12-18 08:50:57
Python语言 | 飞熊在天 Python语言 发表于 2012 年 3 月 5 日 由 raphaelzhang 如果把高中AppleⅡ上用过的Basic算起,我用过的编程语言应该有十种以上了。 其中工作中用过的有C,C++,pascal(OP/Delphi),java,C#,basic(VB),Unix/Linux shell(awk),perl,python,PHP,javascript,所谓工作中用过的,就是我凭这些语言写的程序赚过钱的。另外自己捣鼓过的还有haskell,F#,scala,Go,D,Object-C,汇编,eiffel等,至于erlang,lisp,prolog,lua,ruby,dart等语言,那就只见过demo程序,自己没写过了。当然,像html,css,xml/xslt,bat,jsp/asp,SQL这样的语言没有被我算在编程语言里。 就我个人来说,我最喜欢Python语言和C语言。 D语言 看上去不错,不过没什么前途, Go语言 也挺好,也许以后会多用,但是现在首先是还没出1.0版(计划2012上半年会出),而且现在Windows上的实现不行,先等会。 Python语言的好处在于表现力强,兼库多且给力。而C语言的好处在于对底层的抽象不多也不少。它们都有简洁的优点,而且不像Perl的简洁,Python代码阅读起来很容易懂

人生苦短之我用Python篇(队列、生产者和消费者模型)

社会主义新天地 提交于 2019-12-18 01:37:31
队列: queue. Queue ( maxsize=0 ) #先入先出 queue. LifoQueue ( maxsize=0 ) #last in fisrt out queue. PriorityQueue ( maxsize=0 ) #存储数据时可设置优先级的队列 Queue. qsize ( ) Queue. put ( item , block=True , timeout=None ) Queue. put_nowait ( item ) Queue. get ( block=True , timeout=None ) Queue. get_nowait ( ) Queue. empty ( ) #return True if empty Queue. full ( ) # return True if full import queue q = queue.PriorityQueue() q.put((-1,"chenronghua")) q.put((3,"hanyang")) q.put((10,"alex")) q.put((6,"wangsen")) print(q.get()) print(q.get()) print(q.get()) print(q.get()) q = queue.LifoQueue() q.put(1) q.put(2) q

python与GIL

左心房为你撑大大i 提交于 2019-12-16 11:05:18
一、GIL是什么,它为什么会存在   python被人诟病最多的大概就是它的GIL全局锁了,但我今天要为它正名,这与python本身没有关系,而是与它的解释器有关系。   我们知道,python代码编写好,最终运行的是一个.py的文件,运行代码的过程,其实就是让解释器把我们编写的代码解释给机器能识别的语言的过程。可以解释python代码的解释器有很多,如: cpython(官方解释器) ipython(基于cpython的一种解释器,交互更强,其他与cpython一样) pypy(采用JIT(Just In Time)也就是即时编译编译器,对Python代码执行动态编译,目的是加快执行速度) jython(Java平台上的解释器) ironpython(与jython类似,只不过ironPython是运行在微软.Net平台上的Python解释器)   官方使用的解释器是cpython,也就是当我们从官网下载安装python的时候,就已经默认使用python解释器是cpython。而GIL就是cpython在解释python代码的时候给它加的一个锁,GIL全称是Global Interpreter Lock(全局解释器锁),所以GIL与cpython有关,与python无关,你可以换一种没有GIL的解释器。   那么GIL为什么会存在呢,官网的解释是:GIL是一个互斥锁

pyx编译

醉酒当歌 提交于 2019-12-15 19:08:27
1. 初衷 最近学用python,python不愧是为程序员考虑的 编程 语言,写起来很快很方便,大大节省开发效率。而且,对于小规模程序,运行效率也不错。前两天写了一篇博文《【总结】学用python写程序》,大大地夸奖了python一番。不过这两天,我就受到“诅咒”了。数据规模稍微大一点,python的执行效率的差劲就体现出来了。这两天写的一个程序,尽管在我所知道的范围内,我做了python语言能做的优化,不过程序依然运行了五个小时之久。想把程序改成c++的,不过开发时间较长,而且未来可能还有改动。所以暂罢。 上网上查了查python效率的问题。一方面,网上这方面资料不是很多,例如:我们都知道stl里面set是用红黑树实现的,不过python的set怎么实现的,貌似网上没有。这说明用python的人貌似都不关心效率问题。另一方面,据网上资料说,python运行效率比java还慢。我作为c++程序员从前很鄙视java的运行效率,原来python还不如java呢!不过java是 虚拟机 ,python是解释器,为什么python更慢呢?原因在于python更加“面向对象”,python的所有类型都是对象,连最普通的整数变量都是对象,都要在运行的时候才能够确定类型、才能够动态创建......这大大加重了运行时的负担,所以运行效率才这么差。对比之下,同样的程序用cython写