并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
1.线程queue :会有锁
q=queue.Queue(3)
q.get()
q.put() 先进先出 队列
后进先出 堆栈
优先级队列
"""先进先出 队列"""
import queue
q=queue.Queue(3) #先进先出->队列 q.put('first')
q.put(2)
# q.put('third')
# q.put(4)
q.put(4,block=False) #q.put_nowait(4)
# q.put_nowait(4)
# q.put(4,block=True) # True 阻塞 False 不阻塞 直接告诉你 队列满了
# q.put(4,block=True,timeout=3) # 阻塞等待3秒 还没有拿走数据就抛异常
#
print(q.get())
print(q.get())
print(q.get())
print(q.get(block=True,timeout=2)) # false 不阻塞没有数据就抛异常 默认是阻塞 block=True
print(q.get_nowait()) # 相当于block=false
# def get(self, block=True, timeout=None): """后进先出 堆栈"""
import queue
q=queue.LifoQueue(3) #后进先出->堆栈
q.put('first')
q.put(2)
q.put('third') print(q.get())
print(q.get())
print(q.get()) """优先级队列 """
import queue
q=queue.PriorityQueue(3) #优先级队列 q.put((10,{'alice':12})) # 数字越小 优先级越高 优先拿出来
q.put((40,'two'))
q.put((30,'three')) print(q.get())
print(q.get())
print(q.get())
2.线程池进程池:
client server 是IO 操作应该用多线程
计算密集型: 用多进程
io密集型:用多线程 池:对数目加以限制,保证机器正常运行
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time,random def task(name):
print('name:%s pid:%s run' %(name,os.getpid()))
time.sleep(random.randint(1,3)) if __name__ == '__main__':
pool=ProcessPoolExecutor(4) # 不指定 默认是cpu的核数
# pool=ThreadPoolExecutor(5) for i in range(10):
pool.submit(task,'egon%s' %i) # 异步调用池子收了10个任务,但同一时间只有4个任务在进行 pool.shutdown(wait=True) # 类似join 代表往池子里面丢任务的入口封死了 计数器-1 print('主')
"""
主 # # 异步调用池子收了10个任务,但同一时间只有4个任务在进行
name:egon0 pid:60056 run # 只有4个pid
name:egon1 pid:64700 run
name:egon2 pid:59940 run
name:egon3 pid:60888 run name:egon4 pid:60888 run name:egon5 pid:60056 run
name:egon6 pid:60888 run name:egon7 pid:60056 run
name:egon8 pid:64700 run
name:egon9 pid:59940 run
"""
# pool.shutdown(wait=True) # 代表往池子里面丢任务的入口封死了 计数器-1
"""
name:egon0 pid:57124 run
name:egon1 pid:62252 run
name:egon2 pid:55736 run
name:egon3 pid:62060 run
name:egon4 pid:57124 run
name:egon5 pid:62252 run
name:egon6 pid:55736 run
name:egon7 pid:55736 run
name:egon8 pid:62060 run
name:egon9 pid:55736 run
主
""" from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import currentThread
import os,time,random def task():
print('name:%s pid:%s run' %(currentThread().getName(),os.getpid()))
time.sleep(random.randint(1,3)) if __name__ == '__main__':
pool=ThreadPoolExecutor(5) for i in range(10):
pool.submit(task) pool.shutdown(wait=True) print('主')
"""
name:ThreadPoolExecutor-0_0 pid:61508 run
name:ThreadPoolExecutor-0_1 pid:61508 run
name:ThreadPoolExecutor-0_2 pid:61508 run
name:ThreadPoolExecutor-0_3 pid:61508 run
name:ThreadPoolExecutor-0_4 pid:61508 run
name:ThreadPoolExecutor-0_2 pid:61508 run
name:ThreadPoolExecutor-0_4 pid:61508 run
name:ThreadPoolExecutor-0_0 pid:61508 run
name:ThreadPoolExecutor-0_3 pid:61508 run
name:ThreadPoolExecutor-0_1 pid:61508 run
主
"""
3.异步调用与回调机制:
提交任务的两种方式:
同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行,效率低
异步调用:提交完任务后,不等待任务执行完毕。异步调用+回调机制 自动触发叫回调
"""同步调用"""
from concurrent.futures import ThreadPoolExecutor
import time
import random def 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(13) shit1=pool.submit(la,'alex').result()
weigh(shit1) shit2=pool.submit(la,'wupeiqi').result()
weigh(shit2) shit3=pool.submit(la,'yuanhao').result()
weigh(shit3) """异步调用 + 回调机制 自动触发叫回调"""
from concurrent.futures import ThreadPoolExecutor
import time
import random def 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(13) # pool.submit(la, 'alex')
# pool.submit(la, 'wupeiqi')
# pool.submit(la, 'yuanhao') pool.submit(la,'alex').add_done_callback(weigh) # 实现了程序的解耦合
pool.submit(la,'wupeiqi').add_done_callback(weigh)
pool.submit(la,'yuanhao').add_done_callback(weigh)
4.异步调用与回调机制应用:
pip3 install requests
requests 异步调用+回调机制的 应用场景:
from concurrent.futures import ThreadPoolExecutor
import requests
import time def get(url): # io操作 基于线程 数目有限 用线程池
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)
并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制的更多相关文章
- Python Django 协程报错,进程池、线程池与异步调用、回调机制
一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...
- 13 并发编程-(线程)-异步调用与回调机制&进程池线程池小练习
#提交任务的两种方式 #1.同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行 一.提交任务的两种方式 1.同步调用:提交任务后,就在原地等待任务完毕,拿 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- Python并发编程之线程池&进程池
引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...
- Pthread 并发编程(一)——深入剖析线程基本元素和状态
Pthread 并发编程(一)--深入剖析线程基本元素和状态 前言 在本篇文章当中讲主要给大家介绍 pthread 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...
随机推荐
- oracle 快速批量插入复杂数据的内容
最近迷上一种批量插入的方法,一句sql解决,将需要插入的数据用with as 的方式查出来,不管多么复杂的sql,都可以用临时表的方式查出来,然后直接插入,这样代码更加清晰 流程也简单 insert ...
- Netty 源码分析之 番外篇 Java NIO 的前生今世
简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...
- OpenGL ES 简单教程
什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. ...
- STM32CubeMX软件工程描述_USART配置过程
推荐 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前面 学习本文之前可以查 ...
- 硬件设计之串口收发器---ISO1050 (现行) 隔离式 5V CAN 收发器
http://www.ti.com.cn/product/cn/iso1050 http://www.deyisupport.com/question_answer/dsp_arm/sitara_ar ...
- Py3+PyQt5+Eric6:学习记录之第一天:点击按钮获取文本框的值并输出。
一.使用qt designer拖拽界面. 使用qtdesigner拖拽界面:
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- jquery合并表格中相同文本的相邻单元格
<!DOCTYPE HTML> <html> <head> <title>Example</title> <meta char ...
- MFC存储图片到SQL Server数据库
第一步:建立数据库表,比如:id char,pic image. 第二步:建立MFC单文档应用程序,再添加类CMyRecordset,基类选择CRecordset,导入数据库的刚建立的表. 第三步:在 ...
- SqlAlchemy使用详解
python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sq ...