线程queue、线程进程池,协程
线程queue
import queue
q = queue.Queue() #先进先出
q = queue.LifoQueue() #先进后出
t = queue.PriorityQueue() #优先级取数据,通常这个元组的第一个值是int类型
q.put('123')
q.put('qweqwe')
print(q.get())
print(q.get())
t.put('100', 'tank')
t.put('10', 'nick')
t.put('1', 'jason')
print(t.get())
print(t.get())
print(t.get())
q.task_done()
q.task_done()
q.join()
线程定时器
from threading import Thread, Timer
import time
def task():
print('线程执行了')
time.sleep(2)
print('线程结束了')
t = Timer(3, task) #过了3秒后开启了一个线程
t.start()
多线程实现socket服务端
#服务端
from threading import Thread
import socket
def talk(conn):
while True:
try:
info = conn.recv(1024)
if len(info) == 0: break
print(str(info, encoding = 'utf8'))
conn.send(info.upper())
except ConnectionResetError:
print('客户端关闭了一个连接')
break
conn.close()
def server_demo():
server = socket.socket(
socket.AF_INET, socket.SOCK_STREAM
)
server.bind(('127.0.0.1', 8001))
server.listen(4)
while True:
conn,addr = server.accept()
print(conn, addr)
t = Thread(target=talk)
t.start()
if __name__ == '__main__':
server_demo()
#客户端
from threading import Thread,currentThread
import socket
def client_demo():
client = socket.socket()
client.connect(('127.0.0.1', 8001))
while True:
msg = f'{currentThread().name}'
client.send(bytes(msg, encoding = 'utf8'))
info = client.recv(1024)
print(str(info, encoding = 'utf8'))
client.close()
if __name__ == '__main__':
for i in range(10):
t = Thread(target = client_demo)
t.start()
多线程中的Queue队列中join()与task_done()
'''
Queue.task_done():在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。
Queue.join():实际上意味着等到队列为空,再执行别的操作
如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列中到底有没有结束。
可以理解为,每task_done一次,就从队列里删掉一个元素,这样在最后Join的时候根据队列长度是否为0来判断队列是否结束,从而执行主线程
'''
import queue
q = queue.Queue()
q.put('123')
q.put('qwe')
q.task_done()
q.task_done()
q.join() #这样的话,程序不会被挂起,但是如果只有一个task_done(),则会被挂起
线程池和进程池
进程池和线程池:
池的功能限制进程数或线程数.
什么时候限制?
当并发的任务数量远远大于计算机所能承受的范围时,即无法 一次性开启过多的任务数量,我就应该考虑去限制进程数或线程数 ,从而保证服务器不崩。
## 线程池和进程池
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from threading import currentThread
from multiprocessing import current_process
import time
def task(i):
print(f'{currentThread().name} 正在执行任务 {i}')
time.sleep(2)
print('\n\n\n')
return i**2 #每次线/进程执行完都会返回一个值
if __name__ == '__main__':
pool = ProcessPoolExecutor(5) #设置进程池的大小,每次只允许有5个进程同时运行
# pool = ThreadPoolExecutor(5)
fu_list = [] #列表用于保存任务对象
for i in range(15): #一共有15个任务
future = pool.submit(task, i) #把任务提交给进程执行
fu_list.append(future) #把任务对象加到列表中
pool.shutdown() #关闭线程池的入口
for fu in fu_list: #任务执行完接收返回值
print(fu.result())
#回调函数
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from threading import currentThread
from multiprocessing import current_process
import time
def task(i):
print(f'{currentThread().name} 正在执行任务 {i}')
time.sleep(2)
return i**2
def fun(future):
print(future.result())
if __name__ == '__main__':
pool = ProcessPoolExecutor(5)
# pool = ThreadPoolExecutor(5)
for i in range(15):
future = pool.submit(task, i)
future.add_done_callback(fun)
'''
回调函数:
为当前任务绑定了一个函数,在当前
任务执行结束的时候会触发这个函数,会把future对象作为参数传给函数
,这个称为回调函数,处理完了回来就调用这个函数
'''
协程(待补充)
'''
python的线程用的是操作系统原生的线程
协程:单线程下实现并发
并发:切换加保存状态
多线程:主要由操作系统帮忙实现,遇到io操作或者执行时间过
长就会切换。
什么样的协程是有意义的:
遇到io切换的时候才有意义
具体:
协程概念本质是程序员抽象出来的,操作系统根本不知道协程的存在,一个线程遇到io,该线程内部把CPU切到别的任务上了,操作系统就发现不了,这样实现了单线程下效率最高
'''
'''
优点:
自己控制切换要比操作系统切换快的多
缺点:
对比多线程
自己检测所有io, 但凡有一个阻塞整体都跟着阻塞
对比多进程
无法利用多核优势
为什么要有协程(遇到io切换)?
自己控制切换要比操作系统切换快的多,降低了单个线程的io时间
'''
线程queue、线程进程池,协程的更多相关文章
- 进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】
本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到"协程"的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开 ...
- 进程、线程、轻量级进程、协程和go中的Goroutine
进程.线程.轻量级进程.协程和go中的Goroutine 那些事儿电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程 ...
- 进程、线程、轻量级进程、协程与 go 的 goroutine
本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到“协程”的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开发时也经常用,但是协 ...
- Go语言 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿
原文:http://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html 电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用py ...
- python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程
GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...
- 定时器、线程queue、进程池和线程池
1.定时器 指定n秒后,执行任务 from threading import Timer,current_thread import os def hello(): print("%s he ...
- python3多进程 进程池 协程并发
一.进程 我们电脑的应用程序,都是进程,进程是资源分配的单位.进程切换需要的资源最大,效率低. 进程之间相互独立 cpu密集的时候适合用多进程 #多 ...
- python运维开发(十一)----线程、进程、协程
内容目录: 线程 基本使用 线程锁 自定义线程池 进程 基本使用 进程锁 进程数据共享 进程池 协程 线程 线程使用的两种方式,一种为我们直接调用thread模块上的方法,另一种我们自定义方式 方式一 ...
- python并发编程之Queue线程、进程、协程通信(五)
单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
随机推荐
- 微信小程序绑定列表数据
js代码 Page({ /** * 页面的初始数据 */ data: { words:[] } wxml代码 <view wx:for="{{words}}" class=' ...
- java web开发需要注意的地方
java需要注意的 1.字符串值相等比较 c#用双等号(==)来进行 字符串值相等比较.如下: string a="3"; string b="3"; if(a ...
- Scala词法文法解析器 (二)分析C++类的声明
最近一直在学习Scala语言,偶然发现其Parser模块功能强大,乃为BNF而设计.啥是BNF,读大学的时候在课本上见过,那时候只觉得这个东西太深奥.没想到所有的计算机语言都是基于BNF而定义的一套规 ...
- 《Linux就该这么学》培训笔记_ch02_一些必须掌握的Linux命令
本文在原来作者的基础上做一些符合自己的修改.原文参考: <Linux就该这么学>培训笔记_ch02_一些必须掌握的Linux命令. 本章的内容虽然多,基本都是书本原话,但是笔记能精 ...
- HTML -------- 标签、元素、属性,
HTMl 中的标签.元素.属性, one.标签 :HTML是由一套标记标签 (markup tag)组成,通常就叫标签 标签由开始标签和结束标签组成 <p> 这是一个开始标签 </p ...
- Eureka概述
1:Eureka是什么 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以及·实现云端中间层服务发现和故障转移 ...
- 运维开发实践——基于Sentry搭建错误日志监控系统
错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错... 就是提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注 ...
- Postman安装使用
下载链接:https://www.getpostman.com/downloads/ 选择下载的版本 postman基础功能介绍 collection在postman里面相当于一个文件夹,可以把同一个 ...
- PyCharm使用分享
常用快捷键 PyCharm的快捷键可以通过Setting->keymap查看和设置,如果不知道具体在哪个位置,可以在搜索框中搜索 如果不习惯PyCharm默认的快捷键,也不想去设置,比如习惯了使 ...
- Qt keyevent学习笔记
在按下一个键不放后,会发生: 1.触发keypressevent(),此时isautorepeat()返回false: 2.set isautorepeat(),使其返回值为true; 3.触发key ...