线程

  • 队列:先进先出
  • 堆栈:后进先出
  • 优先级:数字越小优先级越大,越先输出
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. [OpenCV] Samples 17: Floodfill

    一种聚类方式,代码解析 #!/usr/bin/env python ''' Floodfill sample. Usage: floodfill.py [<image>] Click on ...

  2. spray 处理 response 的通用函数

    def handleActorResponse: PartialFunction[Try[Any], (StatusCode, ResponseResult)] = { case Failure(ex ...

  3. INTERVAL

    select sysdate - interval '10' day as "10天前",       sysdate - interval '10' hour as " ...

  4. C# 根据类名创建类的实例对象

    因为我使用这个方法的类都是和AbstractScenePageDTO处于一个命名空间以及程序集下的,所以获取命名空间和程序集的时候,直接使用AbstractScenePageDTO这个类进行获取,这样 ...

  5. 火狐浏览器报错“support.mozilla.org

    火狐浏览器有时候再打开新网页会报此错“support.mozilla.org 有时候火狐浏览器会出现如下状况 解决方法 在地址栏键入”about:config” 点击“我了解此风险” 在下方任意位置右 ...

  6. parent对象

    在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...

  7. bootstrapValidator多字段联合验证(如开始日期和结束日期中,开始日期不可晚于结束日期)

    接触bootstrapvalidator时间不久,最近需要多个字段共同验证,网上查了一下未找到,查阅api文档,发现确实可以实现. 先看dom <div class="form-gro ...

  8. hdu2594 Simpsons' Hidden Talents【next数组应用】

    Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  9. php实现简单消息发送+极光推送系统

    前几天刚写完的一个东西,写的比较简单,没有使用其他插件,原生php+计划任务实现 极光推送的代码 /* $receiver="registration_id" : [ " ...

  10. *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED

    *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 在软件已经执行破解仍然出现,是因为工程是破解前建立的,要先执行 ...