python回调函数中使用多线程的方法
下面的demo是根据需求写的简单测试脚本
#!/usr/bin/envpython #coding:utf-8 #第一个列表为依赖组件和版本号,后面紧跟负责人名称 #接着出现第二个以来组建列表,负责人为空了 #所以根据需求需要对组件、版本号、负责人进行不同处理 #这时在for循环中根据if判断,写回调函数处理 #格式不一致数据的测试数据 a=[[u'tool-1',u'1.9.13'],u'xiaowang',u'xiaoqu',[u'tool-2',u'1.9.23'],[u'tool-3',u'1.9.33'],[u'tool-4',u'1.9.43'],u'pi',[u'tool-5',u'1.9.53']] #a=[[u'tool-1',u'1.9.13'],u'xiaowang',[u'tool-2',u'1.9.23'],u'xiaowang',[u'tool-3',u'1.9.33'],u'xiaowang'] #a=[[u'tool-1',u'1.9.13']] #[u'tool-1',u'1.9.13'] your_pro=a[0] #printyour_pro #[u'xiaowang',u'xiaoqu',[u'tool-2',u'1.9.23']] tmp=a[1:] #printtmp defgit_callback(whole_v,proj_value,name_value): #如果存在负责人存在 try: iftype(name_value[0])isunicode: #对除去列表0个索引的数据(依赖名和版本号)后面的数据进行遍历 foriinname_value: #碰到后面的数据是列表的进行回调 iftype(i)islist: tmp_index=whole_v.index(i)+1 returngit_callback(whole_v,whole_v[whole_v.index(i)],whole_v[tmp_index:]) else: #打印依赖、版本号负责人开始 printproj_value+i.split()+['start'] else: #如果负责人后跟的组件这种格式的列表数据为空 #也就是只有依赖和版本号列表数据,负责人为空,就打印依赖版本号 ver=proj_value owner=name_value iftype(owner[0])isunicode: returngit_callback(whole_v,ver,owner) else: printver #这里是为了判断是不是到列表的最后一位 #如果是最后一个值,且不是字符串的Unicode,而是列表 #就直接打印出项目 ifwhole_v.index(owner[0])==len(whole_v)-1: #打印最后一个值 printwhole_v[-1:] else: #这里比较绕,打印调试吧... new_ver=whole_v[whole_v.index(ver)+1] owner=whole_v[whole_v.index(ver)+2:] returngit_callback(whole_v,new_ver,owner) exceptIndexErrorase: printproj_value printe git_callback(a,your_pro,tmp)
demo的output:
Boom:git_responsepirogue$pythontest.py [u'tool-1',u'1.9.13',u'xiaowang','start'] [u'tool-1',u'1.9.13',u'xiaoqu','start'] [u'tool-2',u'1.9.23'] [u'tool-3',u'1.9.33'] [u'tool-4',u'1.9.43',u'pi','start'] [u'tool-5',u'1.9.53'] listindexoutofrange
python的多线程
下面的代码是从主程序中,摘取出来的代码片段
frommultiprocessing.dummyimportPoolasThreadPool #判断git查询返回的依赖数据格式不唯一的回调 defgit_callback(whole_v,proj_value,name_value,git_cookie): # whole_v=whole_v list_git=[] ifname_value: #printname_value foriinname_value: #printi ifi: iftype(i)islist: tmp_index=whole_v.index(i)+1 returngit_callback(whole_v,whole_v[whole_v.index(i)],whole_v[tmp_index:],git_cookie) else: git_cookie=str(git_cookie.split()[0])+''+str(git_cookie.split()[1]) list_git.append(tuple(git_cookie.split("?")+i.split())) printlist_git pool=ThreadPool(100) result=pool.map(pool_git,list_git) printresult pool.close() pool.join() else: printproj_value
上面的多线程代码片段是一个回调函数,没有完全根据demo进行改装,有了demo根据需求改起来也不难,多调试就可以了。
python多线程接收多个参数
frommultiprocessing.dummyimportPoolasThreadPool pool=ThreadPool(100) result=pool.map(pool_git,list_git) printresult pool.close() pool.join()
pool_git是你需要多线程调用的功能函数,list_git是pool_git函数需要接收的参数,默认情况下pool_git是一个接收一个参数的函数。
但是我们的功能常常设计的逻辑比较复杂,需要在pool_git中传入多个参数,这时list_git就应该给一个多个元组组成的列表。
stackoverflow上老外给的代码示例:
defmulti_run_wrapper(args): returnadd(*args) defadd(x,y): returnx+y if__name__=="__main__": frommultiprocessingimportPool pool=Pool(4) results=pool.map(multi_run_wrapper,[(1,2),(2,3),(3,4)]) printresults output [3,5,7]
StackOverflow上更多的答疑方便你更好的理解:
https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments
相信聪明的你一定能看得懂~
多线程与多进程
frommultiprocessing.dummyimportPoolasThreadPool
多线程进程池,绑定一个CPU核心
frommultiprocessingimportPool
多进程,运行于多个cpu核心
如果你搞不懂是CPU密集型的任务,还是IO密集型的任务,那就用这个库两条import都写上,然后分别实例化跑一下就知道耗时长短,用法上只是在创建对象上改几个字母就行Pool和ThreadPool的互换。
总结
以上所述是小编给大家介绍的python回调函数中使用多线程的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!