线程

  • 队列:先进先出
  • 堆栈:后进先出
  • 优先级:数字越小优先级越大,越先输出
import queue

q = queue.Queue(3) # 先进先出-->队列

q.put('first')
q.put(2)
# q.put('third')
# q.put(4) #由于没有人取走,就会卡主
q.put(4,block=False) #等同于q.get_nowait(), Ture 阻塞,Flase不阻塞,报异常满了
# # q.put(4,block=True,timeout=3) print(q.get())
print(q.get())
print(q.get())
print(q.get(block=True,timeout=3)) # 阻塞等待3秒 没有取走数据就报异常
# print(q.get(block=False)) #等同于q.get_nowait()
# print(q.get_nowait()) q = queue.LifoQueue(3) #后进先出-->堆栈
q.put('first')
q.put(2)
q.put('third') print(q.get())
print(q.get())
print(q.get())
'''
打印结果:
third
2
first
''' q = queue.PriorityQueue(3) #优先级队列 q.put((10,'one'))
q.put((40,'two'))
q.put((30,'three')) print(q.get())
print(q.get())
print(q.get())
'''
数字越小优先级越高
打印结果
(10, 'one')
(30, 'three')
(40, 'two')
'''

线程queue

进程池线程池

  • 池:是用来对进程(线程)的数量加以限制
  • 进程池:计算密集型,用多进程
  • 线程池:IO密集型,用多线程,例如:sockect网络通信就应该用多线程
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time,random '''
sockect网络通信是IO操作,所以用多线程
计算密集型:用多进程
''' def task(name):
print('name:%s pid:%s run' %(name,os.getpid()))
time.sleep(random.randint(1,3)) if __name__ == '__main__':
# pool = ProcessPoolExecutor(4) # 进程池最多装4个进程,不指定的话默认是cpu的核数
pool = ThreadPoolExecutor(5)
for i in range(10):
pool.submit(task,'yang%s' %i) # 异步调用池子收了10个任务,但同一时间只有4个任务在进行 pool.shutdown(wait=True) # 类似join 代表往池子里面丢任务的入口关掉 计数器-1
print('主')
'''
打印结果:
name:yang0 pid:11120 run
name:yang1 pid:11120 run
name:yang2 pid:11120 run
name:yang3 pid:11120 run
name:yang4 pid:11120 run name:yang5 pid:11120 run
name:yang6 pid:11120 run
name:yang7 pid:11120 run name:yang8 pid:11120 run
name:yang9 pid:11120 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 = ProcessPoolExecutor(4) # 进程池最多装4个进程,不指定的话默认是cpu的核数
pool = ThreadPoolExecutor(5)
for i in range(10):
pool.submit(task) # 异步调用池子收了10个任务,但同一时间只有4个任务在进行 pool.shutdown(wait=True) # 类似join 代表往池子里面丢任务的入口关掉 计数器-1
print('主')
'''
打印结果:
name:ThreadPoolExecutor-0_0 pid:14052 run
name:ThreadPoolExecutor-0_1 pid:14052 run
name:ThreadPoolExecutor-0_2 pid:14052 run
name:ThreadPoolExecutor-0_3 pid:14052 run
name:ThreadPoolExecutor-0_4 pid:14052 run
name:ThreadPoolExecutor-0_2 pid:14052 run
name:ThreadPoolExecutor-0_1 pid:14052 run
name:ThreadPoolExecutor-0_3 pid:14052 run
name:ThreadPoolExecutor-0_4 pid:14052 run
name:ThreadPoolExecutor-0_0 pid:14052 run

'''

进程池|线程池

同步调用和异步调用

提交任务的两种方式:

  • 同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行
  • 异步调用:提交完任务后,不在原地等待任务执行完。回调机制:自动触发
#1.同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行

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(10) shit1 = pool.submit(la,'alex').result()
weigh(shit1) shit2 = pool.submit(la,'yang').result()
weigh(shit2) shit3 = pool.submit(la,'hang').result()
weigh(shit3)
'''
打印结果:
alex is laing
alex 拉了 <8>kg
yang is laing
yang 拉了 <8>kg
hang is laing
hang 拉了 <7>kg
'''

同步调用

#2.异步调用:提交完任务后,不在原地等待任务执行完
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(10) shit1 = pool.submit(la,'alex').add_done_callback(weigh) shit2 = pool.submit(la,'yang').add_done_callback(weigh) shit3 = pool.submit(la,'hang').add_done_callback(weigh)
'''
打印结果:
alex is laing
yang is laing
hang is laing
hang 拉了 <10>kg
alex 拉了 <7>kg
yang 拉了 <12>kg
'''

异步调用

异步调用的应用

from concurrent.futures import ThreadPoolExecutor
import requests
import time def get(url):
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)
'''
打印结果:
GET http://www.cnblogs.com/linhaifeng
GET https://www.python.org
http://www.cnblogs.com/linhaifeng parse res is 16320
GET https://www.openstack.org
https://www.python.org parse res is 49273
https://www.openstack.org parse res is 64040
'''

应用

并发编程---线程queue---进程池线程池---异部调用(回调机制)的更多相关文章

  1. 并发编程,python的进程,与线程

    并发编程 操作系统发展史 基于单核研究 多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 切换+保存状态 例子:洗衣 烧水 做饭 切换 1.程序遇到IO操作系统会立刻剥夺走CP ...

  2. Python 3 并发编程多进程之进程与线程

    Python 3 进程与线程 进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的 ...

  3. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  4. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  5. java并发编程笔记(七)——线程池

    java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺 ...

  6. python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02

    目录 进程补充 进程通信前言 Queue队列的基本使用 通过Queue队列实现进程间通信(IPC机制) 生产者消费者模型 以做包子买包子为例实现当包子卖完了停止消费行为 线程 什么是线程 为什么要有线 ...

  7. Java并发学习(一):进程和线程

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 俗话说得好"一人 ...

  8. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  9. 【Java并发编程】之二:线程中断

    [Java并发编程]之二:线程中断 使用interrupt()中断线程 ​ 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一 ...

随机推荐

  1. [Full-stack] 网页布局艺术 - Less

    故事背景 一个过程: template/html ----> css ----> less ----> bootstrap/flex ----> Semantic-ui fle ...

  2. 断网环境下利用pip安装Python离线安装包

    这几天搞Windows离线断网环境下安装Python包,配置环境,各种坑!做个记录,供以后查询吧. # 生产环境 windows 7 # python 2.7.9 # pip 1.5.2 友情提示:当 ...

  3. 【Docker】退出容器和进入容器

    运行容器:docker run -it 镜像名 /bin/bash 退出容器: exit 或者 Ctrl+P+Q 查看容器:docker ps -a 查看运行的容器:docker ps 重启容器:do ...

  4. Markdown 代码

    我们使用三个反引号来标记代码,语法及效果如下: ```python #!/usr/bin/env python #-*- coding:utf- -*- print("Hello World ...

  5. Cannot change version of project facet Dynamic Web Module to 3.0 异常问题处理

    如何解决Tomcat服务器在初始化应用的时候的以下异常问题 1,Cannot change version of project facet Dynamic Web Module to 3.0 2,O ...

  6. J - Intersection

    来源poj 1410 You are to write a program that has to decide whether a given line segment intersects a g ...

  7. vue 数据管道

    文档https://cn.vuejs.org/v2/guide/filters.html html 片段 <div class="app"> <div>{{ ...

  8. web.config 加密/解密 正确版

    一般加密方式: 利用Aspnet_regiis: cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 aspnet_regiis -pe "co ...

  9. 洛谷P1192 台阶问题【记忆化搜索】

    题目:https://www.luogu.org/problemnew/show/P1192 题意: 给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案. 思路: 本来傻乎乎上来就递归,显然会 ...

  10. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...