一 . 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之路--线程的其他方法的更多相关文章

  1. python之路----线程

    线程概念的引入背景 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  2. Python之路——线程池

    1 线程基础 1.1 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2 线程同步——锁 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样,其实Python中是伪多线程).但是当线程 ...

  3. python之路 线程、进程、协程、队列、python-memcache、python-redis

    一.线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threa ...

  4. python 并发和线程

    并发和线程 基本概念 - 并行.并发 并行, parallel 互不干扰的在同一时刻做多件事; 如,同一时刻,同时有多辆车在多条车道上跑,即同时发生的概念. 并发, concurrency 同时做某些 ...

  5. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

  6. Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程

    一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. ​ threadin ...

  7. Python之路【第七篇】:线程、进程和协程

    Python之路[第七篇]:线程.进程和协程   Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  8. Python之路,Day9, 进程、线程、协程篇

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  9. Python之路,进程、线程、协程篇

      本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

随机推荐

  1. C++ 参数传值 与 传引用

    参数传值 在 C++ 中,函数参数的传递有两种方式:传值和传引用.在函数的形参不是引用的情况下,参数传递方式是传值的.传引用的方式要求函数的形参是引用.“传值”是指,函数的形参是实参的一个拷贝,在函数 ...

  2. 学习任务,阅读一下Redis分布式锁的官方文档

    地址: https://redis.io/topics/distlock 这是一篇质疑RedLock的论文:https://martin.kleppmann.com/2016/02/08/how-to ...

  3. memcache讲解和在.net中初使用

    memcache讲解和在.net中初使用 2017年10月17日 22:51:36 等待临界 阅读数:503   前言 传统数据库面临的问题 数据库死锁 磁盘IO 正文 了解memcache 原理 基 ...

  4. 吴恩达课后作业学习2-week3-tensorflow learning-1-例子学习

    参考:https://blog.csdn.net/u013733326/article/details/79971488 使用TensorFlow构建你的第一个神经网络 我们将会使用TensorFlo ...

  5. TypeError: "x" is not a function

    https://stackoverflow.com/questions/32751209/jasmine-typeerror-is-not-a-function 信息 TypeError: " ...

  6. BottomNavigationBar

    重点: bottomNavigationBar: BottomAppBar( shape: CircularNotchedRectangle(),//这个就是设置floatingactionbutto ...

  7. Django适合做大用户量的系统吗?

    分几点来答: 1. 首先,这其实是个技术选型题. 做技术选型的时候不能单纯的考虑性能,应该优先考虑业务类型,以及团队水平.另外的话,框架只是其中一环,还有配套呢. 如果是数据驱动型,尤其是要用到关系型 ...

  8. [Spark][Python][DataFrame][Write]DataFrame写入的例子

    [Spark][Python][DataFrame][Write]DataFrame写入的例子 $ hdfs dfs -cat people.json {"name":" ...

  9. JavaEE学习之Spring声明式事务

    一.引言 上一篇文章,学习了AOP相关知识,并做了一个简单的Hello world.本文在上篇文章的基础上,进一步学习下Spring的声明式事务. 二.相关概念 1. 事务(Transaction)— ...

  10. 配置Nginx虚拟主机

    实验环境 一台最小化安装的CentOS 7.3虚拟机 配置基本环境 1. 安装nginx yum install -y epel-* yum isntall -y nginx vim 2. 建立虚机主 ...