python 线程异步执行踩坑
生活随笔
收集整理的這篇文章主要介紹了
python 线程异步执行踩坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有個需求,一個線程在得到n個數據之后,異步地執行一個子線程函數,在子線程函數中完成數據庫的打開、寫入數據、關閉操作。在子線程函數返回前父線程先返回結果。
在此之前,先導入我們需要的模塊:
version1
百度了一下,參考這篇文章:python線程實現異步任務
這個代碼的執行結果如下:
version2
但是這個子線程函數是沒有添加參數的,如果我這樣寫:
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))結果如下:
start update1 end1 ok1 start update2 end2 ok2 start update3 end3 ok3又變成同步了。
version3
后續又參考了這篇文章:python 之線程池傳入多個參數的方法 ThreadPoolExecutor.submit 多參數支持
from concurrent.futures import ThreadPoolExecutor import timeexecutor = ThreadPoolExecutor()#調用方法 #實質就是通過lambda表達式過渡。傳入的參數是一個,但是通過lambda表達多后拆散為多個傳入。這是很巧妙的方法,實際 就是 *p 這個表達式。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))結果如下:
ok1 ok2 ok3 2 1 3 2 1 3很顯然變成了異步執行了,但是卻不能保證按照開啟順序執行,但是由于我的子線程不需要保證順序執行,所以接下來也就不需要探究了。有解決方案的可以告知我一波。
總結
以上是生活随笔為你收集整理的python 线程异步执行踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: echarts formatter鼠标悬
- 下一篇: python数据库连接池使用