首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python多任务教程:进程、线程、协程

这是因为,python会创建一个主进程(第1个进程),当运行到p1.start()时会创建一个子进程(第2个进程),当运行到p2.start()又会创建一个子进程(第3个进程)2.进程池进程创建和删除是需要消耗计算机资源...() 创建协程对象属于一个组gevent.getcurrent() 返回当前正在执行greenletgevent.joinall(jobs) 将协程任务添加到事件循环,接收一个任务列表gevent.wait...() 可以替代join函数等待循环结束,也可以传入协程对象列表gevent.kill() 杀死一个协程gevent.killall() 杀死一个协程列表所有协程monkey.patch_all()...慎用,它创造了“隐式副作用”,如果出现问题 它很多时候是极难调试。...慎用,它创造了“隐式副作用”,如果出现问题 它很多时候是极难调试

20410

Java Review - 创建线程线程建议指定与业务相关名称

文章目录 概述 线程 不指定线程名称为何难定位问题 Thread默认线程名称 指定线程名称 线程池 不指定线程池名称为何难定位问题 指定线程名称 自定义线程名称 小结 概述 在日常开发中,当在一个应用中需要创建多个线程或者线程最好给每个线程或者线程池根据业务类型设置具体名称...t1和t2,运行上面的代码, 【输出结果】 Thread默认线程名称 运行结果可知,Thread-1抛出了NPE异常,那么单看这个日志根本无法判断是哪个模块线程抛出异常。...首先我们分析下这个Thread-1是怎么来,我们看一下创建线程代码。 /** * Allocates a new {@code Thread} object....指定线程名称 如上代码在创建线程线程指定了一个与具体业务模块相关名称,运行代码,输出结果为 运行结果就可以定位到是模块B抛出了NPE异常,一下子就可以找到问题所在。...,用来记录当前线程编号,它是应用级别的,所有线程池共用一个,比如创建第一个线程线程池编号为1,创建第二个线程线程编号为2,所以pool-2-thread-1里面的pool-1中1就是这个值

59920
您找到你想要的搜索结果了吗?
是的
没有找到

Python自动化开发学习10

gevent.spawn() 事件驱动与异步IO 通常,我们写服务器处理模型程序时,有以下几种模型: 每收到一个请求,创建一个新进程,来处理该请求 每收到一个请求,创建一个新线程,来处理该请求 每收到一个请求...:%s" % error) # 清除连接4个操作,这段代码重复用了3次,应该专门写个函数引用 # 1 列表中清除,这里其实不用判断,...但是后面的for循环里可能会尝试重复remove # 2 如果还有没发出去消息,把连接列表中清除 # 3 关闭连接...:%s" % error) # 清除连接4个操作,这段代码重复用了3次,应该专门写个函数引用 # 1 列表中清除,这里其实不用判断,...但是后面的for循环里可能会尝试重复remove # 2 如果还有没发出去消息,把连接列表中清除 # 3 关闭连接

1K30

Python 编程 | 连载 26 - Python 多线程

线程可以通过threading模块下Thread函数来创建线程对象相关方法有: Thread:创建线程,入参需要传入函数名以及函数参数,返回一个线程对象 start:启动线程 join:阻塞直到线程执行结束...getName:获取线程名 setName:设置线程名 is_alive:判断线程是否存活 setDaemon:守护线程 通过random.choice函数选中一个列中元素,列表中移除该元素并加入另外一个列表...线程池可以避免线程创建和销毁带来消耗,线程池需要通过futures.ThreadPoolExecutir方法来创建线程池相关方法有 futures.ThreadPoolExecutor:创建线程池...(res.done())) 线程池通过submit提交一个任务执行,返回一个Future对象,可以该对象中通过调用result()函数获取任务执行返回值。...与多线程和多进程编程模型相比,异步编程只是在同一个线程之内任务调度 gevent 异步模块 gevent异步包需要通过pip进行安装 python3 -m pip install gevent -i

42920

Python与协程

协程理论 进程是资源分配最小单位,线程是CPU调度最小单位 无论是创建多进程还是创建线程来解决问题,都要消耗一定时间来创建进程、创建线程、以及管理 他们之间切换。...随着我们对于效率追求不断提高,基于单线程来实现并发又成为一个新课题,即只用一个主线程 (很明显可利用cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗时间。...python线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫 交出cpu执行权限,切换其他线程运行) 单线程内开启协程,一旦遇到io,就会应用程序级别(而非操作系统)...单线程这20个任务代码通常会既有计算操作又有阻塞操作,我们完全可以在执行任务1遇到阻 塞,就利用阻塞时间去执行任务2。。。。如此,才能提高效率,这就用到了Gevent模块。...# 初始化greenlet列表存放在数组threads中,此数组被传给gevent.joinall 函数, # 后者阻塞当前流程,并执行所有给定greenlet任务。

33030

多任务之多进程和协程实现

# test1 数据传到队列中 for item in list: queue.put(item) def test2(queue): # 创建一个空列表...一个容器,能够容纳很多进程,但是能够重复运用里面的进程。 加入有10个任务,我们用进程池创建2个进程,当着两个用完,再来两个,以次类推。 什么时候进程池? 1、当不确定需要多少个进程。...让你以为一间在执行多个任务,他们只是协调了步伐,你做时候他不做,他做你不做。...= gevent.spawn(fun2,10) g1.join() g2.join() 如果我创建多任务比较多?...(fun2,10), }) 注:协程中主要用gevent 进程、线程、协程对比 1、进程是资源分配单位 2、线程是操作系统调度单位 3、进程占用资源大 4、线程需要资源一般,效率一般 5、协程需要资源小

82240

Python之协程

但是我们知道无论是创建多进程还是创建线程来解决问题,都要消耗一定时间来创建进程、创建线程、以及管理他们之间切换。   ...随着我们对于效率追求不断提高,基于单线程来实现并发又成为一个新课题,即只用一个主线程(很明显可利用cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗时间。...单线程内开启协程,一旦遇到io,就会应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!...单线程这20个任务代码通常会既有计算操作又有阻塞操作,我们完全可以在执行任务1遇到阻塞,就利用阻塞时间去执行任务2。。。。如此,才能提高效率,这就用到了Gevent模块。...# 初始化greenlet列表存放在数组threads中,此数组被传给gevent.joinall 函数, # 后者阻塞当前流程,并执行所有给定greenlet任务。

61370

如何解决在DLL入口函数中创建或结束线程卡死

以上都是题外话,本文主要说明在DLL入口函数里面创建和退出线程为什么卡死和如何解决问题。...1)在 DLL_PROCESS_ATTACH 事件中 创建线程 出现卡死问题 通常情况下在这事件中仅仅是创建并唤醒线程,是不会卡死,但如果同时有等待线程正式执行代码,则会卡死,因为在该事件中...实际上如果是通过LoadLibrary加载DLL,则会在LoadLibrary结束前后某一刻正式执行)。...解决办法同样是避免在 DLL_PROCESS_DETACH事件中结束线程,那么我们可以在该事件中,创建并唤醒另外一个线程,在该新线程里,结束需要结束线程,并在完成后结束自身即可。...提醒: 标准做法还是建议遵循MS规则,不要在DLL入口函数中做线程相关创建和释放操作。 总体上代码如下: ?

3.7K10

python3--协程,greenlet模块,gevent模块

但是我们知道无论是创建多进程还是创建线程来解决问题,都要消耗一定时间来创建进程、创建线程、以及管理他们之间切换。   ...随着我们对于效率追求不断提高,基于单线程来实现并发又成为一个新课题,即只用一个主线程(很明显可利用cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗时间。   ...单线程内开启协程,一旦遇到io,就会应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!...单线程这20个任务代码通常会既有计算操作又有阻塞操作,我们完全可以在执行任务1遇到阻塞,就利用阻塞时间去执行任务2。。。。...#  初始化greenlet列表存放在数组threads中,此数组被传给gevent.joinall 函数, #  后者阻塞当前流程,并执行所有给定greenlet任务。

2.7K41

用python编写nmap扫描工具--采用协程方式

协程是一种轻量级线程,协程拥有自己寄存器上下文和栈。协程调度切换,将寄存器上下文和栈保存到其他地方,在切回来时候,恢复先前保存寄存器上下文和栈。...也就是说同一线程一段代码执行着执行着就可以中断,然后跳去执行另一段代码,当再次回来执行代码块时候,接着之前中断地方开始执行。...协程优点: 1、执行效率高,尤其是在线程数较多情况下,与多线程对比优势更明显 2、不需要多线程锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好,...2、进行阻塞(Blocking)操作(如IO)会阻塞掉整个程序 接下来,让我们通过一段代码来看一下运行效果: import gevent from gevent import monkey import...安装命令:pip install gevent gevent.spawn()函数:创建协程对象 gevnet.joinall([传入携程对象列表]):会等待所有协程对象运行结束后再退出 接下来改造端口扫描代码

53630

Python多任务协程:编写高性能应用秘密武器

因为函数切换不是线程切换,而是由程序自身控制,因此,没有线程切换开销,和多线程比,线程数量越多,协程性能优势就越明显。...# pip install geventimport gevent创建协程gevent 模块使用 spawn 类创建协程实例对象,实现协程任务创建。...(task)g2 = gevent.spawn(task)g1.join()g2.join()协程组在创建多个协程对象后,可以将多个协程对象放入一个元组或列表中,然后使用 gevent.joinall(...个协程对象列表gs = [gevent.spawn(task) for i in range(5)]gevent.joinall(gs)协程切换从前面的代码执行结果看,虽然可以执行多个协程任务,但是任务执行过程依然是同步...(0.001)# 使用列表推导式,生成一个有5个协程对象列表gs = [gevent.spawn(task) for i in range(5)]gevent.joinall(gs)协程任务函数传参在创建协程对象时候

13210

Python 【基础面试题】

线程共享环境 包括进程代码段、进程共有数据等,利用这些共享数据,线程之间很容易实现通信。 操作系统在创建进程,必须为改进程分配独立内存空间,并分配大量相关资源,但创建线程则简单得多。...操作系统在创建进程,需要为该进程重新分配系统资源,但创建线程代价则小得多。...,因为线程是程序执行流最小单元,当设置多线程,主线程创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己任务以后,就退出了,此时子线程会继续执行自己任务...拷贝序列类型对象(列表\元组),默认是浅拷贝。 垃圾回收机制 引用计数 原理 当一个对象引用被创建或者复制,对象引用计数加1;当一个对象引用被销毁,对象引用计数减1....在属性查找,经典类查找方式为深度优先,新式类是广度优先。仅python3中有类mro函数方法,输出继承父类顺序列表

1.2K20

【PYTHON模块】:协程与greenl

协程:又称为微线程,英文名称Coroutine。 作用:它拥有自己寄存器上下文和栈,能保留上一次调用时状态,可以随时暂停程序,随时切换回来。...优点:     •无需线程上下文切换开销     •无需原子操作锁定及同步开销       •方便切换控制流,简化编程模型     •高并发+高扩展性+低成本:一个CPU支持上万协程都不是问题。...所以很适合用于高并发处理 缺点:     •无法利用多核资源:协程本质是个单线程,它不能同时将 单个CPU 多个核用上,协程需要和进程配合才能运行在多CPU上     •进行阻塞(Blocking...实现协程:第三方库,需要安装 实现了异步I/O,操作 方法 参数 作用 示例 spawn(func,func_args) func:加入gevent函数名func_args:函数参数 把函数,创建协程实例...joinall[spawn_list] spawn_list:spawn方法列表创建协程实例添加到异步列表等待列表所有实例执行完毕 sleep(time) time:时间(秒) 交出CPU

36210

Python-并发下载-gevent

而多进程下,多线程可以利用多核资源,这是单进程协程模型做不到。 二、协程爬虫流程分析 由于协程切换不像多线程调度那样耗费资源,所以不用严格限制协程数量。 ?...① 将要爬取网址存储在一个列表中,由于针对每个网址都要创建一个协程,所以需要准备一个待爬取网址列表。 ② 为每个网址创建一个协程并启动该协程。协程会依次执行,爬取对应网页内容。...由于协程切换不用切换线程上下文,消耗比较小,所以不用严格限制协程数量。每个协程负责爬取网页,并将网页中目标数据解析出来。 ③ 将爬取到目标数据存储在一个列表中。...、 ④ 遍历数据列表,将数据存储在本地文件中。 三、第三方库 gevent gevent 是一个基于协程 Python 网络库。...# 安装: pip install gevent 引用 import geventgevent常用方法 gevent.spawn() 创建并启动协程 gevent.joinall() 等待所有协程执行完毕

1.3K20

Python 线程&进程与协程

创建使用线程◆ 在 Python 中创建线程需要用到一个类,threading类,其类实现方法是底层调用了C语言原生函数来实现创建线程,创建线程有两种方式,一种是直接使用函数创建线程,另一种则是使用类创建线程...◆ 由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据可能会出现脏数据,所以就出现了线程概念,即在同一刻只允许一个线程执行操作,在这里我们选择使用Rlock...进程与线程区别,有以下几种解释: ● 新创建一个线程很容易,新创建一个进程需要复制父进程 ● 线程共享创建进程地址空间,进程有自己地址空间 ● 主线程可以控制相当大线程在同一进程中,...,协程适用场景:当程序中存在大量不需要CPU操作(IO操作),适用于协程....,而 get 方法相反,队列中获取任务,需要注意是,在这些方法中,有些方法由于多线程原因,返回值并不一定是准确,例如qsize,empty等函数统计结果.

73520

Python全栈开发之并发编程

run方法,用于定义线程功能函数,可以在我们自己类中覆盖该方法,当创建自己线程类对象后,可以start方法,进行调度 线程执行顺序 线程执行顺序是不确定,当执行到sleep语句线程将会被阻塞...Process动态生成进程,但是当进程数量上百甚至上千,我们再采用Process创建进程就可以猝死了,此时可以使用pool,初始化pool,可以指定一个最大进程数,当有新请求提交到pool,如果线程池没有满...,称为生成器,生成器是一种特殊迭代器 创建生成器 将列表生成式定界符改成() G = ( x*2 for x in range(5)) G at...0x000001E86BC993B8> 创建生成式和生成器区别仅在于定界符,L是一个列表,G是一个生成器,我们可以直接打印出列表每个元素,而对于生成其,我们可以按照迭代器使用方法来使用 使用yield...CPU上下文那么程序还是可以运行,说到这,小伙伴们是不是想到了上文介绍yield 协程和线程差异 在实现多任务, 线程切换系统层面远不止保存和恢复 CPU上下文这么简单。

69210

Python 三程三器那些事

:',t3 - t2) # 列表时间: 5.821957349777222 4、生成器作用 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限。...而且,创建一个包含100万个元素列表,不仅占用很大存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用空间都白白浪费了。...所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环过程中不断推算出后续元素呢? 这样就不必创建完整list,从而节省大量空间。...yield相当于 return 返回一个值,并且记住这个返回位置,下次迭代,代码yield下一条语句开始执行。...,就会有一个列表 协程1这个操作就会被注册到这个列表中,然后就切换到其他协程去处理; 等待os拿到要读file后,也会把这个文件句柄放在这个列表中 然后等待在切换到协程1时候,协程1就可以直接列表中拿到数据

85250

12.python进程协程异步IO

进程池中有以下几个主要方法: apply:进程池里取一个进程并执行 apply_async:apply异步版本 terminate:立刻关闭线程池 join:主进程等待所有子进程执行完毕,必须在close...协程是一种用户态轻量级线程 , 即协程有用户自己控制调度 协程拥有自己寄存器上下文和栈。协程调度切换,将寄存器上下文和栈保存到其他地方,在切回来时候,恢复先前保存寄存器上下文和栈。..., 最大限度利用CPU 缺点 : 协程本质是单线程下 , 无法利用多核 , 可以是一个程序开启多个进程 , 每个进程内开启多个线程 , 每个线程内开启协程 协程指的是单个线程 , 因而一旦协程出现阻塞...func3(): print("running in func3 ") gevent.sleep(0) print("其它两个还在IO阻塞先运行") #创建协程实例 gevent.joinall...,所以gevent需要修改Python自带一些标准库,这一过程在启动通过monkey patch完成: (2)爬虫例子: from urllib import request import gevent

89080
领券