博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程队列,线程池和协程
阅读量:6992 次
发布时间:2019-06-27

本文共 2569 字,大约阅读时间需要 8 分钟。

线程的其他方法:

  threading.current_thread() #当前线程对象

  getName() # 获取线程名

  ident  # 获取线程id

     threading.enumerate()   # 当前正在运行的线程对象的一个列表

  threading.active_count()  # 当前正在运行的线程数量

import timefrom threading import Thread,current_threaddef f1(n):    print(f"{n}号线程正在运行")    print("子线程的名称",current_thread().getName())if __name__ == '__main__':    t = Thread(target=f1,args=(1,),name = '123')    t.start()    print("主线程的名称", current_thread().getName())

  

 

线程队列:(重点)

  import queue

   先进先出队列:queue.Queue(3)

   先进后出\后进先出队列:queue.LifoQueue(3) 

   优先级队列:queue.priorityQueue(3)

           put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,越先被get到被取出来,第二个参数是put进去的值,如果说优先级相同,那么值别忘了应该是相同的数据类型,字典不行

import queue# q = queue.Queue(3)# q.put(1)# q.put(2)# print(q.qsize())# try :#     q.put_nowait(3)# except :#     print('满了')# print(q.full())## print(q.get())# print(q.get())# print(q.get())q = queue.PriorityQueue(3)q.put((2,'white'))q.put((1,'卢本伟'))q.put((2,'55开'))print(q.get())print(q.get())print(q.get())

  

 

线程池:

  from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

  t = ThreadPoolExecutor(4)  #默认的线程个数是cpu个数 * 5

  p = ProcessPoolExecutor(4)  #默认的进程个数是cpu个数

  t.map(f1,可迭代的对象)  #异步执行

import  timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef f1(n):    time.sleep(1)    print(n)if __name__ == '__main__':    t = ThreadPoolExecutor(5)    t.map(f1,range(10))    t.shutdown()    print('主程序结束')

  

  def f1(n1,n2):

    print(n1,n2)

  t.submit(f1,11,12)  #异步提交任务

  res = t.submit(f1,11,12) 

  res.result()  #和get方法一样,如果没有结果,会等待,阻塞程序

    shutdown()  # close+join,锁定线程池,等待线程池中所有已经提交的任务全部执行完毕

import  timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef f1(n,m):    time.sleep(1)    print(n)    return n+mif __name__ == '__main__':    t = ThreadPoolExecutor(5)    t_lis = []    for i in range(10):        ret = t.submit(f1,i,5)        t_lis.append(ret)    t.shutdown()    for i in t_lis:        print(i.result())    print('主程序结束')

  

协程的概念:可以理解为微线程,在遇到io阻塞时,保存当前状态并进行切换,且阻塞时间是并行的. 既节省时间,又提高效率.

  import gevent  #导入模块

  gevent.sleep(1)   # 该方法的阻塞时间可以被识别并执行,如果是time.sleep()是不能识别,且不会节省时间的

  g1 = gevent.spawn(f1)    # 异步提交f1和f2任务

  g2 = gevent.spawn(f2)   # 异步提交f1和f2任务

  gevent.joinall ( [g1,g2] )   # 等待执行完才继续执行     相当于 g1.join() 和 g2.join() 

  

import geventdef f1():    print('1号开启游戏')    gevent.sleep(2)    print('1号吃鸡了')def f2():    print('2号开启游戏')    gevent.sleep(2)    print('2号吃鸡了')g1 = gevent.spawn(f1)    #异步提交f1任务g2 = gevent.spawn(f2)    #异步提交f2任务g1.join()g2.join()       # gevent.joinall([g1,g2])print("主程序结束")

  

转载于:https://www.cnblogs.com/gyc-tzx/p/10268835.html

你可能感兴趣的文章
Linux命令的那些事(二)
查看>>
强制转https
查看>>
Ubuntu下GTK的安装、编译和测试
查看>>
javascript中window.open()与window.location.href的区别
查看>>
Respond.js的作用
查看>>
FCN笔记(Fully Convolutional Networks for Semantic Segmentation)
查看>>
外部线程停止Java子线程的方法
查看>>
OpenMP并行编程
查看>>
网络编程
查看>>
【ZJOI2016】线段树
查看>>
ActiveMQ-自定义用户验证
查看>>
IOS 项目加入SDL库 --- FFMPEG+SDL学习 之 二
查看>>
mysql的sql文件的备份与还原
查看>>
Java API —— 泛型
查看>>
十三周进度报告
查看>>
「APIO2018」选圆圈
查看>>
单例模式的那些事
查看>>
Canvas - 时钟绘制
查看>>
linux-vsftp
查看>>
modelsim 中如何加载多个对比波形文件
查看>>