python之路--线程的其他方法
一 . current_thread的用法
import threading
import time
from threading import Thread, current_thread
def func(n):
time.sleep(1)
print('子线程名称', current_thread().getName()) # Thread-1
print(f'{n}号线程任务')
if __name__ == '__main__':
t = Thread(target=func, args=(1,))
t.start()
print('主线程名称',current_thread().getName()) # MainThread
print('主线程ID',current_thread().ident)
print(current_thread()) # 当前运行的进程
print(threading.enumerate()) # 列举正在运行的线程
print(threading.active_count()) # 查看有多少正在运行的线程
二 . 线程队列(重点)
1. 先进先出(FIFO)队列 (常用)
import queue
# 一:先进先出队列
q = queue.Queue(3) #先进先出 fifo first in first out
q.put(1)
q.put(2)
print('当前队列内容长度',q.qsize())
q.put(3)
print('查看队列是否满了', q.full())
try:
q.put_nowait(4) # 用put_nowait 因为队列是共享的,不确定谁往里面放东西,所以用它试错
except Exception:
print('队列满了')
print(q.get())
print(q.get())
print('查看队列是否为空', q.empty())
print(q.get())
print('查看队列是否为空', q.empty())
try:
q.get_nowait() # queue.Empty
except Exception:
print('队列空了')
2.先进后出(FILO) (常用)
import queue
# 二 先进后出队列,或者后进先出,类似于栈
q = queue.LifoQueue(3) q.put('乔峰')
q.put('段誉')
q.put('虚竹') print(q.get()) # 虚竹
print(q.get()) # 段誉
print(q.get()) # 乔峰
3.优先级队列 (不常用)
import queue
#优先级队列
q = queue.PriorityQueue(5)
# 先比较元组前边数字的大小,数字越小优先级越高, -1 < 0 < 1,
# 如果数字相同,比较元元组第二项
q.put((5,'alex'))
q.put((2,'宝宝'))
q.put((7,'大力')) print(q.get()) # (2, '宝宝')
print(q.get()) # (5, 'alex')
print(q.get()) # (7, '大力')
三 . 线程池(重点)
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def f1(n,s):
time.sleep(1)
# print(n,s)
return f'{n}号' + s if __name__ == '__main__':
tp = ThreadPoolExecutor(4) # 线程的个数里面的参数 * 5, 不写参数就是cpu核数 * 5
# tp = ProcessPoolExecutor(4) 这个是进程,这个方法比较常用 进程的个数就是参数,不写就是cpu 的核数
# tp.map(f1,range(10)) #异步提交任务(瞬间提交,不执行里面的函数),参数同样是任务名称,可迭代对象
res_list = []
for i in range(10):
# tp.submit(f1,{'段誉':i},'六脉神剑') 不能接返回值,下面的可以
res = tp.submit(f1,i,'乔峰') # submit是给线程池异步提交任务, 里面随便传参
print(res)
res_list.append(res)
tp.shutdown() #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
for r in res_list:
print(r.result()) # 相当于 进程里面的 .get()
print('主线程结束')
四. 协程
1. 生成器版协程(最low,了解)
import time
def f1():
for i in range(5):
time.sleep(0.5)
print('f1>>',i)
yield
def f2():
g = f1()
for i in range(5):
time.sleep(0.5)
print('f2>>', i)
next(g)
f1()
f2()
# f2 与 f1 交替出值
2. greenlet版协程(中档,了解)
import time
from greenlet import greenlet
def f1(n):
print('第一次执行f1' + n)
time.sleep(1)
g2.switch('阿朱') # 第一次传参就行 以后的g2.switch() 不用传参
print('第二次执行f1' + n)
g2.switch()
def f2(n):
print('第一次执行f2' + n)
time.sleep(1)
g1.switch()
print('第二次执行f2' + n)
g1 = greenlet(f1) # 实例化一个greenlet对象,并将任务名称作为参数参进去
g2 = greenlet(f2)
g1.switch('乔峰') # 里面可以传参, 执行g1里面的任务
3. gevent 真正的协程(重点)
from gevent import monkey;monkey.patch_all()
import gevent
import time
def f1():
print('第一次f1')
# gevent.sleep(1)
time.sleep(2)
print('第二次f1')
return 15
def f2():
print('第一次f2')
# gevent.sleep(2)
time.sleep(3)
print('第二次f2')
s = time.time()
g1 = gevent.spawn(f1) # 异步提交了f1任务
g2 = gevent.spawn(f2) # 异步提交了f2任务
gevent.joinall([g1,g2]) # 必须joinall 不然主协程代码执行结束后就结束,不管上面的代码是否执行
e = time.time()
print('执行时间:', e-s)
print('主程序任务')
# 两个gevent模块必须都导入,如果只import gevent模块,那么只有gevent.sleep()这种IO模式可以并发,其他IO不支持并发
上例gevent.sleep(2)模拟的是gevent可以识别的 IO阻塞. 而time.sleep(2)或者是其他的阻塞, gevent是不能直接识别的, 需要用下面的一段代码, 打补丁, 就可以识别了. from gevent import monkey;monkey.patch_all, 这段代码必须放在被打补丁者的前面,如time, socket模块之前. (只要用到gevent 就直接写在最前面把)
五 . 线程池回调函数
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def f1(n,s):
return n+s
def f2(n):
print('回调函数>>>', n.result()) # 回调函数>>> 23
if __name__ == '__main__':
tp = ThreadPoolExecutor(4)
res = tp.submit(f1, 11, 12).add_done_callback(f2)
python之路--线程的其他方法的更多相关文章
- python之路----线程
线程概念的引入背景 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...
- Python之路——线程池
1 线程基础 1.1 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2 线程同步——锁 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样,其实Python中是伪多线程).但是当线程 ...
- python之路 线程、进程、协程、队列、python-memcache、python-redis
一.线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threa ...
- python 并发和线程
并发和线程 基本概念 - 并行.并发 并行, parallel 互不干扰的在同一时刻做多件事; 如,同一时刻,同时有多辆车在多条车道上跑,即同时发生的概念. 并发, concurrency 同时做某些 ...
- Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)
一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...
- Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程
一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. threadin ...
- Python之路【第七篇】:线程、进程和协程
Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- Python之路,Day9, 进程、线程、协程篇
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- Python之路,进程、线程、协程篇
本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
随机推荐
- JavaScript对象数组根据某属性sort升降序排序
1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16 ...
- Python之Requests库的7个主要方法
方法 说明 requests.request() 构造一个请求,支撑一下各方法的基础方法 requests.get() 获取HTML网页的主要方法 requests.head() 获取网页头信息的方法 ...
- Apache 2.4.27 局域网访问提示 You don't have permission to access / on this server
问题: 本机用localhost和ip都可以访问,局域网不可以访问,并且出现提示 You don't have permission to access / on this server. 解决: 如 ...
- 五、Oracle 分组查询、视图
一.分组函数1.avg:平均分2.sum:求和3.max:最大值4.min:最小值注意:前面四个必须针对数值字段,且参数只能是一个5.count:求个数 二.分组查询1.语法是 group by 分组 ...
- day24 Pythonpython 面向对象设计 类
将一些相同特征和动作的成为类,现有类才能创建对象,对象就是特征和动作的结合体 类:把一类事物的相同特征和动作整合到一起就是类.类是一个抽象概念 对象:就是基于类而创建的一个具的事物(具体存在的),也是 ...
- Spring Security(十七):5.8 Method Security
From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...
- python:利用logbook模块管理日志
日志管理作为软件项目的通用部分,无论是开发还是自动化测试过程中,都显得尤为重要. 最初是打算利用python的logging模块来管理日志的,后来看了些github及其他人的自动化框架设计,做了个比对 ...
- day92之支付宝支付
Python之支付宝支付 正式环境:用营业执照,申请商户号,appid 基于支付宝的测试环境:https://openhome.alipay.com/platform/appDaily.htm?tab ...
- 测试工具使用-Qunit单元测试使用过程
031302620 应课程要求写一篇单元测试工具的博客,但是暂时没用到java,所以不想使用junit(对各种类都不熟悉的也不好谈什么测试),原计划是要用phpunit,但是安装经历了三个小时,查阅各 ...
- el-date-picker 快捷日期简单计算
const oneDaySeconds = 3600 * 1000 * 24 pickerOptions: { shortcuts: [ { text: '今天', onClick(picker) { ...