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.异步调用与回调机制的更多相关文章

  1. Python Django 协程报错,进程池、线程池与异步调用、回调机制

    一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...

  2. 13 并发编程-(线程)-异步调用与回调机制&进程池线程池小练习

    #提交任务的两种方式 #1.同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行 一.提交任务的两种方式 1.同步调用:提交任务后,就在原地等待任务完毕,拿 ...

  3. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  4. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

  5. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  6. Python并发编程之线程池&进程池

    引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  7. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  8. Java并发编程(二)如何保证线程同时/交替执行

    第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...

  9. Pthread 并发编程(一)——深入剖析线程基本元素和状态

    Pthread 并发编程(一)--深入剖析线程基本元素和状态 前言 在本篇文章当中讲主要给大家介绍 pthread 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...

随机推荐

  1. oracle 快速批量插入复杂数据的内容

    最近迷上一种批量插入的方法,一句sql解决,将需要插入的数据用with as 的方式查出来,不管多么复杂的sql,都可以用临时表的方式查出来,然后直接插入,这样代码更加清晰 流程也简单 insert ...

  2. Netty 源码分析之 番外篇 Java NIO 的前生今世

    简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...

  3. OpenGL ES 简单教程

    什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. ...

  4. STM32CubeMX软件工程描述_USART配置过程

    推荐 分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前面 学习本文之前可以查 ...

  5. 硬件设计之串口收发器---ISO1050 (现行) 隔离式 5V CAN 收发器

    http://www.ti.com.cn/product/cn/iso1050 http://www.deyisupport.com/question_answer/dsp_arm/sitara_ar ...

  6. Py3+PyQt5+Eric6:学习记录之第一天:点击按钮获取文本框的值并输出。

    一.使用qt designer拖拽界面. 使用qtdesigner拖拽界面:

  7. 蓝桥杯 历届试题 剪格子(dfs搜索)

    历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...

  8. jquery合并表格中相同文本的相邻单元格

    <!DOCTYPE HTML> <html> <head>   <title>Example</title>   <meta char ...

  9. MFC存储图片到SQL Server数据库

    第一步:建立数据库表,比如:id char,pic image. 第二步:建立MFC单文档应用程序,再添加类CMyRecordset,基类选择CRecordset,导入数据库的刚建立的表. 第三步:在 ...

  10. SqlAlchemy使用详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sq ...