并发编程 - 线程 - 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 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...
随机推荐
- yield return关键字怎么使用?
在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一: 复制代码 yield return <expression>;yield break; 备注计算表达式并以枚举数 ...
- Android基础总结(十一)Fragment,动画
Fragment(重要) 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity fragmen ...
- 树链剖分 + 后缀数组 - E. Misha and LCP on Tree
E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...
- 二分 + 模拟 - Carries
Carries Problem's Link Mean: 给你n个数,让你计算这n个数两两组合相加的和进位的次数. analyse: 脑洞题. 首先要知道:对于两个数的第k位相加会进位的条件是:a%( ...
- jq 按回车键 登陆
$("body").keydown(function(e) { if (event.which == "13") {//keyCode= ...
- 使用asp.net调用谷歌地图api
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...
- C++ 引用本质的详解
//引用本质的理解① #include<iostream> using namespace std; int GetA(){ ; return a; } int & GetB(){ ...
- 【BZOJ】1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(dp/-bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1616 我觉得bfs是可过的,但是交bfs上去是wa? 然后没办法看dp,原来这bfs能和dp联系在一 ...
- BT下载会损害硬盘吗
简而言之,这个问题是否存在,取决于网络带宽的发展速度与硬件性能的发展速度.如果硬件发展的速度快, 网络带宽速度发展慢,那么对大多数人而言,当前的硬件在慢速的带宽下载BT不会造成任何的硬盘损坏. ...
- zara
[1]ZARA是西班牙Inditex集团旗下的一个子公司,它既是服装品牌,也是专营ZARA品牌服装的连锁零售品牌.1975年设立于西班牙的ZARA,隶属于Inditex集团,为全球排名第三.西班牙排名 ...