python 线程异步执行踩坑
生活随笔
收集整理的這篇文章主要介紹了
python 线程异步执行踩坑
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有個(gè)需求,一個(gè)線程在得到n個(gè)數(shù)據(jù)之后,異步地執(zhí)行一個(gè)子線程函數(shù),在子線程函數(shù)中完成數(shù)據(jù)庫的打開、寫入數(shù)據(jù)、關(guān)閉操作。在子線程函數(shù)返回前父線程先返回結(jié)果。
在此之前,先導(dǎo)入我們需要的模塊:
version1
百度了一下,參考這篇文章:python線程實(shí)現(xiàn)異步任務(wù)
這個(gè)代碼的執(zhí)行結(jié)果如下:
version2
但是這個(gè)子線程函數(shù)是沒有添加參數(shù)的,如果我這樣寫:
def update_mysql(id):executor.submit(do_update(id))return "ok" + str(id)def do_update(id):time.sleep(3)print('start update' + str(id))time.sleep(1)print("end"+ str(id))returnprint(update_mysql(1)) print(update_mysql(2)) print(update_mysql(3))結(jié)果如下:
start update1 end1 ok1 start update2 end2 ok2 start update3 end3 ok3又變成同步了。
version3
后續(xù)又參考了這篇文章:python 之線程池傳入多個(gè)參數(shù)的方法 ThreadPoolExecutor.submit 多參數(shù)支持
from concurrent.futures import ThreadPoolExecutor import timeexecutor = ThreadPoolExecutor()#調(diào)用方法 #實(shí)質(zhì)就是通過lambda表達(dá)式過渡。傳入的參數(shù)是一個(gè),但是通過lambda表達(dá)多后拆散為多個(gè)傳入。這是很巧妙的方法,實(shí)際 就是 *p 這個(gè)表達(dá)式。def update_mysql(id):args =[id,id,id]executor.submit(lambda p: doFileParse(*p),args)return "ok" + str(id)def doFileParse(filepath,segment,wordslist):time.sleep(3)print(filepath)time.sleep(1)print(segment)returnprint(update_mysql(1)) print(update_mysql(2)) print(update_mysql(3))結(jié)果如下:
ok1 ok2 ok3 2 1 3 2 1 3很顯然變成了異步執(zhí)行了,但是卻不能保證按照開啟順序執(zhí)行,但是由于我的子線程不需要保證順序執(zhí)行,所以接下來也就不需要探究了。有解決方案的可以告知我一波。
總結(jié)
以上是生活随笔為你收集整理的python 线程异步执行踩坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: echarts formatter鼠标悬
- 下一篇: “高会日挥金”下一句是什么