• 线程的补充,协程


    线程的其他方法:
    Threading.current_thread() #当前线程对象
    GetName() 获取线程名
    Ident 获取线程id

    Threading.Enumerate() #当前正在运行的线程对象的一个列表
    Threading.active_count() #当前正在运行的线程数量

    线程队列:(重点)
    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)
    # q.put(3)
    # print('查看队列是否满了',q.full())
    #
    # try:
    #     q.put_nowait(4)
    # except Exception:
    #     print('队列满了')
    #
    # print(q.get())
    # print(q.get())
    # print('查看队列是否为空',q.empty())
    # print(q.get())
    # print('查看队列是否为空',q.empty())
    # try:
    #     q.get_nowait()
    # except Exception:
    #     print('队列空了')
    
    
    # q1 = queue.LifoQueue(3)
    #
    # q1.put(1)
    # q1.put(2)
    # q1.put(3)
    #
    # print(q1.get())
    # print(q1.get())
    # print(q1.get())
    
    q2 = queue.PriorityQueue(5)
    q2.put((5,(2,3)))
    q2.put((2,'alex'))  # 如果优先级数字相同,会比较第二个参数的元素的ascii表中的位置,如果数据类型不同会报错
    q2.put((1,{'a': 5}))
    q2.put((-1,45))
    q2.put((2,'llsd'))
    
    print(q2.get())
    print(q2.get())
    print(q2.get())
    print(q2.get())
    print(q2.get())
    

      

    线程池:
    From concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

    P = ThreadPoolExecutor(4) #默认的线程个数是cpu个数 * 5
    P = ProcessPoolExecutor(4) #默认的进程个数是cpu个数
    P.map(f1,可迭代的对象) #异步执行
    Def f1(n1,n2):
    Print(n1,n2)
    P.submit(f1,11,12) #异步提交任务
    Res = P.submit(f1,11,12)

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

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

    import time
    from threading import  current_thread
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    def f1(n,s):
        time.sleep(1)
        # print('%s号子线程' % current_thread().ident)
        # print(n,s)
        return n,s
    
    if __name__ == '__main__':
        tp = ThreadPoolExecutor(4)
        # 异步提交任务,参数同样是任务名称,可迭代对象
        res_list = []
        for i in range(10):
            res = tp.submit(f1,i,'baobao')  #submit是给线程池异步提交任务,
            print(res)
            res_list.append(res)
    
        tp.shutdown()    #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
        for r in res_list:
            print(r.result())
        print('主线程结束')
    

      

    协程
    
    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')
    
    s= time.time()
    g1 = gevent.spawn(f1)  # 异步提交了f1任务
    g2 = gevent.spawn(f2)   # 异步提交了f2任务
    g1.join()
    g2.join()
    gevent.joinall([g1, g2])
    e = time.time()
    print('执行时间:', e-s)
    print('主程序任务')
    

      

  • 相关阅读:
    阿里注册中心 Nacos 启动报错 Unable to start web server
    微服务监控中心springbootadmin 配置登录密码
    flowable 三种方式部署流程
    【IMU/VIOSLAM易混淆知识点】IMU坐标系和其他坐标系关系梳理以及SLAM中BA优化概念
    【C++】【初三知识我忘了。。】三维点最小二乘法拟合平面并求平面和轴的夹角
    米尔嵌入式CPU模组亮相工业控制技术研讨会
    有奖试用,车规级国产工业CPU平台,米尔MYCYT507开发板等你体验
    扎实的基础知识+正确的方法是快速阅读源码的关键
    同一项目、不同版本之间源码的阅读
    .NET MAUI 简介
  • 原文地址:https://www.cnblogs.com/YangWenYu-6/p/10267502.html
Copyright © 2020-2023  润新知