并发编程---线程queue---进程池线程池---异部调用(回调机制)

线程

  • 队列:先进先出
  • 堆栈:后进先出
  • 优先级:数字越小优先级越大,越先输出
import queueq = queue.Queue(3) # 先进先出-->队列

q.put('first')
q.put(2)
# q.put('third')
# q.put(4) #由于没有人取走,就会卡主
q.put(4,block=False)  #等同于q.get_nowait(), Ture 阻塞,Flase不阻塞,报异常满了
# # q.put(4,block=True,timeout=3)print(q.get())
print(q.get())
print(q.get())
print(q.get(block=True,timeout=3)) # 阻塞等待3秒 没有取走数据就报异常
# print(q.get(block=False)) #等同于q.get_nowait()
# print(q.get_nowait())
q = queue.LifoQueue(3) #后进先出-->堆栈
q.put('first')
q.put(2)
q.put('third')print(q.get())
print(q.get())
print(q.get())
'''
打印结果:
third
2
first
'''q = queue.PriorityQueue(3) #优先级队列

q.put((10,'one'))
q.put((40,'two'))
q.put((30,'three'))print(q.get())
print(q.get())
print(q.get())
'''
数字越小优先级越高
打印结果
(10, 'one')
(30, 'three')
(40, 'two')
'''
线程queue

进程池线程池

  • 池:是用来对进程(线程)的数量加以限制
  • 进程池:计算密集型,用多进程
  • 线程池:IO密集型,用多线程,例如:sockect网络通信就应该用多线程
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time,random'''
sockect网络通信是IO操作,所以用多线程
计算密集型:用多进程
'''def task(name):print('name:%s pid:%s run' %(name,os.getpid()))time.sleep(random.randint(1,3))if __name__ == '__main__':# pool = ProcessPoolExecutor(4) # 进程池最多装4个进程,不指定的话默认是cpu的核数pool = ThreadPoolExecutor(5)for i in range(10):pool.submit(task,'yang%s' %i) # 异步调用池子收了10个任务,但同一时间只有4个任务在进行
pool.shutdown(wait=True) # 类似join  代表往池子里面丢任务的入口关掉 计数器-1print('')
'''
打印结果:
name:yang0 pid:11120 run
name:yang1 pid:11120 run
name:yang2 pid:11120 run
name:yang3 pid:11120 run
name:yang4 pid:11120 runname:yang5 pid:11120 run
name:yang6 pid:11120 run
name:yang7 pid:11120 runname:yang8 pid:11120 run
name:yang9 pid:11120 run
主
'''from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import currentThread
import os,time,randomdef task():print('name:%s pid:%s run' %(currentThread().getName(),os.getpid()))time.sleep(random.randint(1,3))if __name__ == '__main__':# pool = ProcessPoolExecutor(4) # 进程池最多装4个进程,不指定的话默认是cpu的核数pool = ThreadPoolExecutor(5)for i in range(10):pool.submit(task) # 异步调用池子收了10个任务,但同一时间只有4个任务在进行
pool.shutdown(wait=True) # 类似join  代表往池子里面丢任务的入口关掉 计数器-1print('')
'''
打印结果:
name:ThreadPoolExecutor-0_0 pid:14052 run
name:ThreadPoolExecutor-0_1 pid:14052 run
name:ThreadPoolExecutor-0_2 pid:14052 run
name:ThreadPoolExecutor-0_3 pid:14052 run
name:ThreadPoolExecutor-0_4 pid:14052 run
name:ThreadPoolExecutor-0_2 pid:14052 run
name:ThreadPoolExecutor-0_1 pid:14052 run
name:ThreadPoolExecutor-0_3 pid:14052 run
name:ThreadPoolExecutor-0_4 pid:14052 run
name:ThreadPoolExecutor-0_0 pid:14052 run
主
'''
进程池|线程池

同步调用和异步调用

提交任务的两种方式:

  • 同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行
  • 异步调用:提交完任务后,不在原地等待任务执行完。回调机制:自动触发
#1.同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行from concurrent.futures import ThreadPoolExecutor
import time
import randomdef la(name):print('%s is laing' %name)time.sleep(random.randint(3,5))res = random.randint(7,13)*'#'return {'name':name,'res':res}def weigh(shit):name = shit['name']size = len(shit['res'])print('%s 拉了 <%s>kg' %(name,size))if __name__ == '__main__':pool = ThreadPoolExecutor(10)shit1 = pool.submit(la,'alex').result()weigh(shit1)shit2 = pool.submit(la,'yang').result()weigh(shit2)shit3 = pool.submit(la,'hang').result()weigh(shit3)
'''
打印结果:
alex is laing
alex 拉了 <8>kg
yang is laing
yang 拉了 <8>kg
hang is laing
hang 拉了 <7>kg
'''
同步调用
#2.异步调用:提交完任务后,不在原地等待任务执行完
from concurrent.futures import ThreadPoolExecutor
import time
import randomdef la(name):print('%s is laing' %name)time.sleep(random.randint(3,5))res = random.randint(7,13)*'#'return {'name':name,'res':res}# weigh({'name':name,'res':res})  # 这样写,所有功能 不能体现出解耦合def weigh(shit):shit = shit.result() # 拿到是一个对象,需要进行result()name = shit['name']size = len(shit['res'])print('%s 拉了 <%s>kg' %(name,size))if __name__ == '__main__':pool = ThreadPoolExecutor(10)shit1 = pool.submit(la,'alex').add_done_callback(weigh)shit2 = pool.submit(la,'yang').add_done_callback(weigh)shit3 = pool.submit(la,'hang').add_done_callback(weigh)
'''
打印结果:
alex is laing
yang is laing
hang is laing
hang 拉了 <10>kg
alex 拉了 <7>kg
yang 拉了 <12>kg
'''
异步调用

异步调用的应用

from concurrent.futures import ThreadPoolExecutor
import requests
import timedef get(url):print('GET %s'%url)response = requests.get(url)time.sleep(3)return {'url':url,'content':response.text}def parse(res):res = res.result()print('%s parse res is %s' %(res['url'],len(res['content'])))if __name__ == '__main__':urls = ['http://www.cnblogs.com/linhaifeng','https://www.python.org','https://www.openstack.org',]pool = ThreadPoolExecutor(2)for url in urls:pool.submit(get,url).add_done_callback(parse)
'''
打印结果:
GET http://www.cnblogs.com/linhaifeng
GET https://www.python.org
http://www.cnblogs.com/linhaifeng parse res is 16320
GET https://www.openstack.org
https://www.python.org parse res is 49273
https://www.openstack.org parse res is 64040
'''
应用

转载于:https://www.cnblogs.com/Mryang123/p/8921962.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

avi编码格式以及查看的视频编码方式的小工具

avi编码格式以及查看的视频编码方式的小工具 2009-06-06 17:55:47| 分类&#xff1a; 默认分类 | 标签&#xff1a; |字号大中小 订阅 首先要说明的是&#xff0c;文件后缀名为avi的文件不一定使用的编码方式就是一样的&#xff0c;所以才写下来&#xff0c;以备以后查阅…

SQL Server遗失管理权限账号密码怎么办?

假如一个SQL Server实例只允许“SQL身份认证”模式登录数据库&#xff0c;而糟糕的是你忘记了sa的密码&#xff08;sa出于安全考虑应该被禁用&#xff0c;这里仅仅为了描述问题&#xff09;或其它具有sysadmin角色的登录名的密码&#xff1f;个人就遇到这样一个案例&#xff0c…

MFC 定时器使用方式

MFC 定时器使用方式 2011-04-30 12:24:58| 分类&#xff1a; 默认分类 | 标签&#xff1a; |字号大中小 订阅 用SetTimer函数 创建定时器 参数1表示定时器的ID&#xff0c;参数2表示时间间隔&#xff0c;最后一个参数是处理的函数&#xff0c;如果填NULL表示&#xff0…

js循环获取table中的值

<script type"text/javascript">function getTdValue() {var tableId document.getElementById("tab");var str "";//获取table中的某一列的值for (var i 1; i < tableId.rows.length; i) {alert(tableId.rows[i].cells[3].innerHTM…

MFC中Radio Button使用方法

MFC中Radio Button使用方法2012-04-19 09:44:22 我来说两句 收藏 我要投稿 先为对话框加上2个radio button&#xff0c;分别是Radio1和Radio2。 问题1&#xff1a;如何让Radio1或者Radio2默认选上&#xff1f;如何知道哪个被选上了&#xff1f; 关键是选上&#x…

使用不可变对象创建值对象

在回答我最近的文章中AutoValue&#xff1a;生成的不可变的值类 &#xff0c; 布兰登认为&#xff0c;这可能是有趣的&#xff0c;看看如何AutoValue比较项目Lombok和Immutables和凯文借调这一点。 我同意这是一个好主意&#xff0c;但是我首先将这篇文章发布为Immutables的简要…

css3 transform实现水平和垂直居中

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible…

ubuntu vnc 远程连接桌面

ubuntu vnc 远程连接桌面 2011-05-18 10:30:48 分类&#xff1a; LINUX 一、WindowsXP远程连接Ubuntu的桌面 1.在WindowsXP上下载并安装RealVNC; 2.在Ubuntu中操作&#xff0c;打开 应用程序/互联网 /远程桌面查看器; 3.首先要配置一下&#xff0c;打开 系统/首选项/远程桌面&…

hkws摄像头拆机

转载于:https://www.cnblogs.com/feipeng8848/p/8961924.html

java虚拟机常用命令工具

java虚拟机常用命令工具 博客分类&#xff1a; 虚拟机 虚拟机jvmjava 一、概述 程序运行中经常会遇到各种问题&#xff0c;定位问题时通常需要综合各种信息&#xff0c;如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分…

Spring Cloud Zuul –编写过滤器

Netflix OSS项目Zuul充当后端服务的网关&#xff0c;并支持添加安全性&#xff0c;路由等边缘功能。 在Zuul世界中&#xff0c;称为Zuul过滤器的组件提供了特定的边缘功能&#xff0c;为基于Spring Cloud的项目编写这种过滤器非常简单。 此处提供了添加过滤器的良好参考。 在这…

嵌入式基础篇 - 第2章 Systick系统定时器

2.1 STM32 的时钟系统 STM32 芯片为了实现低功耗&#xff0c;设计了一个功能完善但却非常复杂的时钟系统。普通的MCU 一般只要配置好 GPIO 的寄存器就可以使用了&#xff0c;但 STM32 还有一个步骤&#xff0c;就是开启外设时钟。 图2-1 STM32的时钟树在 STM32 中&#xff0c;…

kill所有java进程

kill所有java进程 ps -ef | grep java | grep -v grep |awk {print $2} | xargs -p kill -9如果不需要询问&#xff0c;把xargs后面 -p 参数去掉Aix 通过shell脚本kill杀指定进程&#xff0c;比如杀所有java进程 2012-11-16 15:31, Tags: 127人阅读----脚本杀进程-------------…

sqa计划

一、sqa计划 本计划是对“生活在长大”项目的流程规范和约定&#xff0c;本次计划包括质量保证、质量控制、数据收集和统计报告四部分。 质量保证&#xff1a; 保证项目的完整和运行&#xff0c;没有重大BUG。 计划进度 任务      时间        结果       …

正确地kill java历程

正确地kill java历程 www.MyException.Cn 发布于&#xff1a;2012-06-27 14:20:08 浏览&#xff1a;4次正确地kill java进程在linux/unix下&#xff0c;你会怎么中止一个java进程&#xff1f; 你可能会回答 kill -9 pid&#xff0c;这是一种在多数情况下正确的做法。不过&a…

并发加对象锁_通用并发对象池

并发加对象锁在本文中&#xff0c;我们将介绍如何在Java中创建对象池。 近年来&#xff0c;JVM的性能成倍增加&#xff0c;大多数类型的对象几乎都变得多余&#xff0c;从而提高了对象池的性能。 从本质上讲&#xff0c;对象的创建不再像以前那样昂贵。 但是&#xff0c;有些对…

SpringAOP02 自定义注解

1 自定义注解 1.1 创建自定义注解 从java5开始就可以利用 interface 来定义自定义注解 技巧01&#xff1a;注解不能直接干扰程序代码的运行&#xff08;即&#xff1a;注解的增加和删除操作后&#xff0c;代码都可以正常运行&#xff09; 技巧02&#xff1a;Retention 用来声明…

MFC处理回车窗口消失

MFC处理回车窗口消失 2011-04-24 12:21:31| 分类&#xff1a; C&C&VC | 标签&#xff1a;对话框 回车 mfc 消失 |字号大中小 订阅 我的方法是&#xff1a;找到自己设计的按钮&#xff0c;在属性-风格中选择default button&#xff1b;如果没有自己设计的but…

您的框架有多可扩展性?

在参加会议时&#xff0c;我们总是会见到高素质的决策者&#xff0c;他们经常问同样的问题&#xff1a; 您的框架有多可扩展性&#xff1f;如果我需要比您开箱即用的功能更多的东西怎么办&#xff1f; 。 这个问题是非常合理的&#xff0c;因为他们只是不想被卡在开发曲线的中间…

linux常用命令:touch 命令

linux的touch命令不常用&#xff0c;一般在使用make的时候可能会用到&#xff0c;用来修改文件时间戳&#xff0c;或者新建一个不存在的文件。 1&#xff0e;命令格式&#xff1a; touch [选项]... 文件... 2&#xff0e;命令参数&#xff1a; -a 或--timeatime或--timeacces…