美文网首页
python线程池

python线程池

作者: 一杯海风_3163 | 来源:发表于2019-03-27 16:45 被阅读0次

    一、安装

    安装命令
    pip install threadpool

    # -*- coding: utf-8 -*-
    
    # 使用线程池之前
    import time
    def sayhello(str):
        print "Hello ",str
        time.sleep(2)
    
    name_list =['xiaozi','aa','bb','cc']
    start_time = time.time()
    for i in range(len(name_list)):
        sayhello(name_list[i])
    print '使用线程池前   %d second'% (time.time()-start_time)
    
    # threadpool的使用
    
    import time
    import threadpool
    def sayhello(str):
        print "Hello ",str
        time.sleep(2)
    
    name_list =['xiaozi','aa','bb','cc']
    start_time = time.time()
    pool = threadpool.ThreadPool(10) # 括号中的参数为线程池的尺寸/线程数量
    requests = threadpool.makeRequests(sayhello, name_list) # 第一个参数为函数体名称,第二个参数为前面函数调用时需要传入的参数列表
    [pool.putRequest(req) for req in requests]
    pool.wait()
    print '使用线程池后   %d second'% (time.time()-start_time)
    
    

    运行结果:

    Hello  xiaozi
    Hello  aa
    Hello  bb
    Hello  cc
    使用线程池前   8 second
    Hello  xiaozi
    Hello  aa
    Hello  bb
    Hello  cc
    使用线程池后   2 second
    

    可以看出,使用线程池后,运行速度有明显提高。makeRequests(函数体,参数列表)

    二、了解线程池threadpool

    一、安装与简介

    pip install threadpool

    pool = ThreadPool(poolsize)  
    requests = makeRequests(some_callable, list_of_args, callback)  
    [pool.putRequest(req) for req in requests]  
    pool.wait()  
    

    第一行定义了一个线程池,表示最多可以创建poolsize这么多线程;

    第二行是调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写,default是无,也就是说makeRequests只需要2个参数就可以运行;

    第三行用法比较奇怪,是将所有要运行多线程的请求扔进线程池,[pool.putRequest(req) for req in requests]等同于

    for req in requests:

    pool.putRequest(req)

    第四行是等待所有的线程完成工作后退出。

    二、代码实例

    import time
    def sayhello(str):
        print "Hello ",str
        time.sleep(2)
    
    name_list =['xiaozi','aa','bb','cc']
    start_time = time.time()
    for i in range(len(name_list)):
        sayhello(name_list[i])
    print '%d second'% (time.time()-start_time)
    

    结果


    image.png

    改用线程池代码,花费时间更少,更效率

    import time
    import threadpool  
    def sayhello(str):
        print "Hello ",str
        time.sleep(2)
    
    name_list =['xiaozi','aa','bb','cc']
    start_time = time.time()
    pool = threadpool.ThreadPool(10) 
    requests = threadpool.makeRequests(sayhello, name_list) 
    [pool.putRequest(req) for req in requests] 
    pool.wait() 
    print '%d second'% (time.time()-start_time)
    

    结果


    image.png

    当函数有多个参数的情况,函数调用时第一个解包list,第二个解包dict,所以可以这样:

    def hello(m, n, o):
        """"""
        print "m = %s, n = %s, o = %s"%(m, n, o)
         
     
    if __name__ == '__main__':
         
       # 方法1  
        lst_vars_1 = ['1', '2', '3']
        lst_vars_2 = ['4', '5', '6']
        func_var = [(lst_vars_1, None), (lst_vars_2, None)]
        # 方法2
        dict_vars_1 = {'m':'1', 'n':'2', 'o':'3'}
        dict_vars_2 = {'m':'4', 'n':'5', 'o':'6'}
        func_var = [(None, dict_vars_1), (None, dict_vars_2)]    
         
        pool = threadpool.ThreadPool(2)
        requests = threadpool.makeRequests(hello, func_var)
        [pool.putRequest(req) for req in requests]
        pool.wait()        
    

    需要把所传入的参数进行转换,然后带入线程池。

    def getuserdic():
        username_list=['xiaozi','administrator']
        password_list=['root','','abc123!','123456','password','root']
        userlist = []
        
        for username in username_list:
            
            user =username.rstrip()
            for password in password_list:
                pwd = password.rstrip()
                userdic ={}
                userdic['user']=user
                userdic['pwd'] = pwd
                tmp=(None,userdic)
                userlist.append(tmp)
        return userlist
    

    相关文章

      网友评论

          本文标题:python线程池

          本文链接:https://www.haomeiwen.com/subject/wjazvqtx.html