zoukankan      html  css  js  c++  java
  • 线程的补充,协程

    线程的其他方法:
    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('主程序任务')
    

      

  • 相关阅读:
    calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别
    微信小程序中使用 <web-view> 内嵌 H5 时,登录问题的处理方法
    小程序 TabBar 定制
    webpack 代码优化压缩方法
    react-router v4 按需加载的配置方法
    axios发送post请求,如何提交表单数据?
    react中键盘enter事件处理
    常用证件正则表达式
    react中input自动聚焦问题
    React Router v4 页面传值的三种方法
  • 原文地址:https://www.cnblogs.com/YangWenYu-6/p/10267502.html
Copyright © 2011-2022 走看看