有個需求,一個線程在得到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
很顯然變成了異步執行了,但是卻不能保證按照開啟順序執行,但是由于我的子線程不需要保證順序執行,所以接下來也就不需要探究了。有解決方案的可以告知我一波。