• python网络编程--线程的方法,线程池


    一.线程的其他方法(Thread其他属性和方法)

    ident() 获取线程id

    Thread实例对象的方法

    isAlive()  设置线程名
    getName()  返回线程名
    setName()  设置线程名 

    threading模块提供的一些方法:

    threading.currentThread()  返回当前的线程变量
    threading.enumerate()    返回一个包含正在运行的线程的list,正在运行指线程启动后,结束前,不包括启动前和终止后的线程
    threading.activeCount()   返回正在运行的线程数量,与len(threading.enumerate()有相同的结果)
    

     

    示例:

    import threading
    import time
    from threading import Thread,current_thread
    
    def f1(n):
        time.sleep(1)
        print('子线程名称', current_thread().getName()) #Thread-1
        print('%s号线程任务'%n)
    
    
    if __name__ == '__main__':
        t1 = Thread(target=f1,args=(1,))
        t1.start()
        print('主线程名称',current_thread().getName()) #MainThread
        print('主线程ID',current_thread().ident)
        print(current_thread())
        print(threading.enumerate()) #[<_MainThread(MainThread, started 6708)>, <Thread(Thread-1, started 7848)>]
        print(threading.active_count())
        # print('主线程')
    
    主线程名称 MainThread
    主线程ID 5720
    <_MainThread(MainThread, started 5720)>
    [<_MainThread(MainThread, started 5720)>, <Thread(Thread-1, started 12572)>]
    2
    子线程名称 Thread-1
    1号线程任务
    

      

    二.线程队列

    共有三种基本用法:Queue,LifoQueue,PriorityQueue

    1)队列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)  # 报错queue.Full
    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)先进后出队列LifoQueue (last in first out), 类似于栈

    二 先进后出队列,或者后进先出,类似于栈
    q = queue.LifoQueue(3)
    
    q.put(1)
    q.put(2)
    q.put(3)
    
    print(q.get())
    print(q.get())
    print(q.get())
    

      

    3)优先级队列:存储数据时可设置优先级队列

      用put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较,数字越小优先级越高)

    #优先级队列
    q = queue.PriorityQueue(5)
    # q.put((5,'alex'))
    # q.put((2,'嘿嘿'))
    # q.put((7,'哈哈'))
    
    # q.put((5,(2,3)))
    q.put((5,(2,3)))  #如果说值里面的元素是数字类型,那么当两个值的优先级相同时,比较的是两个值的大小,小的优先被取出来
    #如果元素是字符串,那么依次比较每个字母的ascii表中的位置,小的优先被取出来
    # q.put((2,{'x':3}))
    # q.put((5,(1,2)))
    q.put((5,(2,2,3)))
    q.put((2,'zasdf'))
    q.put((-1,'yadsf'))
    q.put((2,{'k':666})) #如果优先级数字相同,如果数据类型不同会报错
    q.put((2,('a','b')))
    q.put((1,(1,2)))
    q.put((3,(1,2)))
    q.put((-10,(1,2)))
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    

      

    三.线程池

    1.使用multiprocessing模块创建

    from threading import Thread
    
    thread_pool = ThreadPoolManger(4)

    2.使用concurrent.futures模块创建

    现在python提供了一个新的标准或者说内置的模块,这个模块里面提供了新的线程池和进程池,之前我们说的进程池是在multiprocessing里面的,现在这个在这个新的模块里面,他俩用法上是一样的。

    将进程池和线程池放到一起,统一使用方式,使用threadPollExecutor和ProcessPollExecutor的方式一样,而且只要通过这个concurrent.futures导入就可以直接用他们两个了
    p = ThreadPoolExecutor(4)  # 默认个数是 cpu的个数*5
    p = ProcessPoolExecutor(4) # 默认个数是cpu的核数
    
    Res.result()  #和get方法一样,如果没有结果,会等待,阻塞程序
    

      

    基本方法:

    submit(fn,*args,**kwargs)        异步提交任务
    
    map(func,*iterables, timeout=None, chunksize=1)     取代for循环submit的操作
    
    shutdown(wait=True)    相当于进程池的pool.close()+pool.join()操作
        wait = True, 等待池内所有任务执行完毕回收完资源后才继续
        wait = False 立即返回,并不会等待池内的任务执行完毕
        但不管wait参数为何值,整个程序都会等到所有任务执行完毕
        submit和map必须在shutdown之前
    
    result(timeout = None)    取得结果
    
    add_done_callback(fn)    回调函数
    

      

    示例:

    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
    
    if __name__ == '__main__':
    
        tp = ThreadPoolExecutor(4)
        # tp = ProcessPoolExecutor(4)
        # tp.map(f1,range(10))  #异步提交任务,参数同样是任务名称,可迭代对象
        res_list = []
        for i in range(10):
            res = tp.submit(f1,i,'baobao')  #submit是给线程池异步提交任务,
            print(res)
            # res.result()
            res_list.append(res)
    
        # for r in res_list:
        #     print(r.result())
    
        tp.shutdown()  #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
        for r in res_list:
            print(r.result())
        print('主线程结束')
    

      

  • 相关阅读:
    kail
    scp命令
    搭建LNMP
    PHP7.3.2安装
    nginx的安装
    CentOS7部署NFS
    Linux使用mailx通过外部smtp发邮件
    kickstart自动化安装
    centos7下单用户模式,救援模式的应用以及虚拟机下的克隆
    putty和xsheel远程连接centos7
  • 原文地址:https://www.cnblogs.com/robertx/p/10268964.html
Copyright © 2020-2023  润新知