并发编程 - 线程 - 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 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...
随机推荐
- 偏于SQL语句的 sqlAlchemy 增删改查操作
ORM 江湖 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函数存储过程 ...
- string--C++ STL 学习
C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,提供了添加删除\替换\查找和比较等丰富的方法. 使用string容器,需要包含头文件声明#include ...
- _BV()
#define _BV(bit) (1 << (bit)) _BV()是把1左移N位的函数._BV(7)相当于(1<<7) 常用于位的置位或清零 示例解析: PC7=7; PO ...
- 逻辑表+session
- php -- 魔术方法 之 对象克隆 : __clone()
产生对象的方法: 1.从类产生对象.new,通过new去堆区开辟一块内存空间 2.从对象产生对象.clone,通过关键字clone,将一个对象完整的复制一份,新开辟一块内存空间,将复制的结果存放到该内 ...
- 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...
- Myeclipse 10 Maven 构建 Java Web 项目
主要介绍如何使用 Myeclipse 10 构建 Maven Web 项目,关于 Maven 的介绍就略过了. 工具/原料 myeclipse apache-maven-3.1.0 方法/步骤 1 下 ...
- SVN入门 服务器VisualSVN Server和客户端TortoiseSVN安装
Subversion是一个版本控制系统,相对于的RCS.CVS,采用了分支管理系统,它的设计目标就是取代CVS.互联网上免费的版本控制服务多基于Subversion. 一.SVN工作原理 SVN(Su ...
- hdu 1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路:dp[u][i]表示以u为根的树选了i个子节点. #include<iostream ...
- Nginx配置里的fastcgi_index和index
在配置nginx时有时会遇到, 所以记录一下 location ^~ /wechat/ { index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_ ...