python回調函數中使用多線程的方法
下面的demo是根據需求寫的簡單測試腳本
#!/usr/bin/env python # coding: utf-8 # 第一個列表為依賴組件和版本號,后面緊跟負責人名稱 # 接著出現第二個以來組建列表,負責人為空了 # 所以根據需求需要對組件、版本號、負責人進行不同處理 # 這時在for循環(huán)中根據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] # print your_pro # [u'xiaowang', u'xiaoqu', [u'tool-2', u'1.9.23']] tmp = a[1:] # print tmp def git_callback(whole_v, proj_value, name_value): # 如果存在負責人存在 try: if type(name_value[0]) is unicode: # 對除去列表0個索引的數據(依賴名和版本號)后面的數據進行遍歷 for i in name_value: # 碰到后面的數據是列表的進行回調 if type(i) is list: tmp_index = whole_v.index(i)+1 return git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:]) else: # 打印依賴、版本號 負責人 開始 print proj_value+i.split()+['start'] else: # 如果負責人后跟的組件這種格式的列表數據為空 # 也就是只有依賴和版本號列表數據,負責人為空,就打印依賴版本號 ver = proj_value owner = name_value if type(owner[0]) is unicode: return git_callback(whole_v, ver, owner) else: print ver # 這里是為了判斷是不是到列表的最后一位 # 如果是最后一個值,且不是字符串的Unicode,而是列表 # 就直接打印出項目 if whole_v.index(owner[0]) == len(whole_v)-1: # 打印最后一個值 print whole_v[-1:] else: # 這里比較繞,打印調試吧... new_ver = whole_v[whole_v.index(ver)+1] owner = whole_v[whole_v.index(ver)+2:] return git_callback(whole_v, new_ver, owner) except IndexError as e: print proj_value print e git_callback(a, your_pro, tmp)
demo的output:
Boom:git_response pirogue$ python test.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'] list index out of range
python的多線程
下面的代碼是從主程序中,摘取出來的代碼片段
from multiprocessing.dummy import Pool as ThreadPool # 判斷git查詢返回的依賴數據格式不唯一的回調 def git_callback(whole_v, proj_value, name_value, git_cookie): # whole_v = whole_v list_git = [] if name_value: # print name_value for i in name_value: # print i if i: if type(i) is list: tmp_index = whole_v.index(i)+1 return git_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())) print list_git pool = ThreadPool(100) result = pool.map(pool_git, list_git) print result pool.close() pool.join() else: print proj_value
上面的多線程代碼片段是一個回調函數,沒有完全根據demo進行改裝,有了demo根據需求改起來也不難,多調試就可以了。
python多線程接收多個參數
from multiprocessing.dummy import Pool as ThreadPool pool = ThreadPool(100) result = pool.map(pool_git, list_git) print result pool.close() pool.join()
pool_git是你需要多線程調用的功能函數,list_git是pool_git函數需要接收的參數,默認情況下pool_git是一個接收一個參數的函數。
但是我們的功能常常設計的邏輯比較復雜,需要在pool_git中傳入多個參數,這時list_git就應該給一個多個元組組成的列表。
stackoverflow上老外給的代碼示例:
def multi_run_wrapper(args): return add(*args) def add(x,y): return x+y if __name__ == "__main__": from multiprocessing import Pool pool = Pool(4) results = pool.map(multi_run_wrapper,[(1,2),(2,3),(3,4)]) print results output [3, 5, 7]
Stack Overflow上更多的答疑方便你更好的理解:
https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments
相信聰明的你一定能看得懂~
多線程與多進程
from multiprocessing.dummy import Pool as ThreadPool
多線程進程池,綁定一個CPU核心
from multiprocessing import Pool
多進程,運行于多個cpu核心
如果你搞不懂是CPU密集型的任務,還是IO密集型的任務,那就用這個庫兩條import都寫上,然后分別實例化跑一下就知道耗時長短,用法上只是在創(chuàng)建對象上改幾個字母就行Pool和ThreadPool的互換。
總結
以上所述是小編給大家介紹的python回調函數中使用多線程的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
使用pandas忽略行列索引,縱向拼接多個dataframe
這篇文章主要介紹了使用pandas忽略行列索引,縱向拼接多個dataframe的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python入門教程(十七)Python的While循環(huán)
這篇文章主要介紹了Python入門教程(十七)Python的While循環(huán),Python是一門非常強大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04python Pexpect 實現輸密碼 scp 拷貝的方法
今天小編就為大家分享一篇python Pexpect 實現輸密碼 scp 拷貝的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python中FastAPI項目使用 Annotated的參數設計的處理方案
FastAPI 是一個非?,F代化和高效的框架,非常適合用于構建高性能的 API,FastAPI 是一個用于構建 API 的現代、快速(高性能)web 框架,基于 Python 類型提示,這篇文章主要介紹了Python中FastAPI項目使用 Annotated的參數設計,需要的朋友可以參考下2024-08-08