一 . 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 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)

    1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...

  2. python——线程与多线程进阶

    之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...

  3. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  4. [python] 线程简介

    参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...

  5. [python] 线程

    来源:田飞雨 链接:http://www.jianshu.com/p/12cd213a93bf 虽然python中由于GIL的机制致使多线程不能利用机器多核的特性,但是多线程对于我们理解并发模型以及底 ...

  6. Python多线程及其使用方法

    [Python之旅]第六篇(三):Python多线程及其使用方法   python 多线程 多线程使用方法 GIL 摘要: 1.Python中的多线程     执行一个程序,即在操作系统中开启了一个进 ...

  7. Python 线程池的原理和实现及subprocess模块

    最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自 ...

  8. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. python多线程几种方法实现

    python多线程编程 Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程 ...

  10. python线程与进程手记

    ------------------------------线程---------------------------#线程应用的第一种方式:thread模块是比较底层的模块#import threa ...

随机推荐

  1. 字符条件变成in条件格式数据

    private string getInQuerySql(string query) { string resulr = ""; foreach (var item in quer ...

  2. AttributeError: module 'shutil' has no attribute 'copyfileobj'

    import shutil #1.copyfileobj(源文件,目标文件) 将文件内容复制到另一个文件 shutil.copyfileobj(open('config.log','r'),open( ...

  3. Exception in thread "main" java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package解决办法(图文详解)

    不多说,直接上干货! 问题详情 SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF ...

  4. ObjextARX-VS2005-字符串转换

    1.使用string必须添加头文件 #include"string"using namespace std; 2.使用CString必须添加头文件(在非MFC工程中) #inclu ...

  5. PMP项目管理学习笔记引言(1)——为啥要取得认证?

    (一)为啥要取得认证? 如果你参与过很多项目,就会发现,你总是在周而复始地面对同样的一些问题.一些常见的问题目前已经有了通用解决方案.经过多年的实战,项目经理已们已经掌握了很多应验教训,而通过PMP( ...

  6. 洛谷P1036 选数

    题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...

  7. Scala 的list

    9.1 使用列表 列表类型:跟数组一样,列表也是同质化的(homogeneous).即所有元素都要是同种类型. 列表结构:所有列表由两部分组成:Nil 和 ::(cons). 基本操作:主要有三个:h ...

  8. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  9. 利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透

    探测内网80端口发现目标IP 目标使用Apache  2.4.7web服务中间件 使用linux    Ubuntu系统 使用御剑扫描了目录 目录扫描到了 http://192.168.31.236/ ...

  10. MAC 安装汇编编译工具 NASM

    直接运行nasm报错: 开始安装: brew reinstall nasm