zoukankan      html  css  js  c++  java
  • python线程池(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)
    复制代码

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

    复制代码
    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)
    复制代码

     当函数有多个参数的情况,函数调用时第一个解包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
  • 相关阅读:
    hadoop-2.7.3安装kafka_2.11-2.1.0
    HBase数据快速导入之ImportTsv&Bulkload
    hbase shell 基本操作
    SQLplus命令中删除键和翻页键不能用的问题
    SQL*Loader 的使用sqlldr和sqluldr2方法详解
    python连接oracle导出数据文件
    python零碎知识点一
    用Python输出一个Fibonacci数列
    问题总结——window平台下gruntower安装后无法运行的问题
    JavaScript学习笔记——浅拷贝、深拷贝
  • 原文地址:https://www.cnblogs.com/ExMan/p/10426326.html
Copyright © 2011-2022 走看看