日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 线程异步执行踩坑

發布時間:2023/12/1 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 线程异步执行踩坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有個需求,一個線程在得到n個數據之后,異步地執行一個子線程函數,在子線程函數中完成數據庫的打開、寫入數據、關閉操作。在子線程函數返回前父線程先返回結果。
在此之前,先導入我們需要的模塊:

from concurrent.futures import ThreadPoolExecutor import timeexecutor = ThreadPoolExecutor()

version1

百度了一下,參考這篇文章:python線程實現異步任務
這個代碼的執行結果如下:

def update_mysql(id):executor.submit(do_update)return "ok" + str(id)def do_update():time.sleep(3)print('start update')time.sleep(1)print("end")returnprint(update_mysql(1)) print(update_mysql(2)) print(update_mysql(3)) ok1 ok2 ok3 start update start update start update end end end

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 线程异步执行踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。