并发编程 - 线程 - 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 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...
随机推荐
- vss安装及服务器端、客户端配置图文教程
安装VSS 一.双击setup. 之后点完成.就安装完了! 服务器端VSS配置 一.选择开始——所有程序——打开 一直下一步 到完成 二.然后再打开 说明:把这个enable rights and ...
- dp之多重背包poj1276
题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数....... 思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的. 反思:这个题目我 ...
- TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法)
TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法) TOTP - Time-based One-time Password Algori ...
- Git中保存用户名和密码
每次操作都需要输入用户名和密码感觉很繁琐,解决方法,在本地的工程文件夹的.git下打开config文件添加: [credential] helper = store 再输入一次用户名密码后就可 ...
- 微博excel数据清洗(Java版)
微博数据清洗(Java版) 原创 2013年12月10日 10:58:24 2979 大数据公益大学提供的一份数据,义务处理一下,原始数据是Excel,含有html标签,如下: 要求清洗掉html ...
- How to activate maven profile inside eclipse
How to activate maven profile inside eclipse Normally maven is use for project dependency management ...
- 一条经典SQL语句优化实例
1.概述 如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒. /*PIXPatient 184176条DomainPatient 184 ...
- 原生Orcale数据库连接
package tj.test.demo; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prepa ...
- JavaScript语言精粹读书笔记- JavaScript对象
JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collecti ...
- 函数 free 的原型
函数 free 的原型如下: void free( void * memblock ); 为什么 free 函数不象 malloc 函数那样复杂呢? 这是因为指针 p 的类型以及它所指 的内存的容量事 ...