并发 --- 5 线程的其他方法 线程队列 线程池 协程

一.线程的其他方法

  1.   theading.current_thread()   当前线程对象

  2.   .getName()    获取线程名

  3.   .ident()   获取线程id

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

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

 

二.线程队列

  1.先进先出队列    queue.Queue()

 

  2.先进后出队列    queue.LifoQueue()

  (和用法相同)

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

  Put的数据是一个元组,元组的第一个参数是优先级数字,

  数字越小优先级越高,越先被get到被取出来,第二个参数

  是put进去的值,如果说优先级相同,那么值别忘了应该是

  相同的数据类型,字典不行

 

三.线程池

  1.from concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

    引入模块

  2.  p = ThreadPoolExecutor(4)

    默认的线程个数是cpu个数的5倍

  3.  p = ProcessPoolExecutor(4)

    默认的进程个数是cpu的个数

  4.  p.map(f1,可迭代对象)

    异步执行

  5.  res = p.submit(f1,11,12)  

    异步提交任务  参数可是多个

  6.  res.result()

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

  7.  shutdown()   

    (和close+join用法一样,锁定线程池,等待线程池中的

    任务全部执行完毕)

   8.线程池的回调函数

 

四.协程

  协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。

  1.生成器类型协程(实现了‘切换+保存状态’,但没有提升效率)

 

  2.greenlet模块类型协程(实现了‘切换+保存状态’,但没有提升效率)

 

  3.gevent模块类型的协程

  即实现了‘切换+保存状态’,又提升效率

 

import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading
def f1():
    print('第一次f1')
    # print(threading.current_thread().getName())
    # gevent.sleep(1)
    time.sleep(2)
    print('第二次f1')
def f2():
    # print(threading.current_thread().getName())
    print('第一次f2')
    # gevent.sleep(2)
    time.sleep(2)
    print('第二次f2')
g1 = gevent.spawn(f1) #异步提交了f1任务
g2 = gevent.spawn(f2) #异步提交了f2任务
# g1.join()
# g2.join()
gevent.joinall([g1,g2])
print('主程序任务')

  

 

posted @ 2019-01-14 16:33  TNTsc  阅读(252)  评论(0编辑  收藏  举报