Python3高并发定时更新任务进程池和线程池的使用
生活随笔
收集整理的這篇文章主要介紹了
Python3高并发定时更新任务进程池和线程池的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python3高并發定時更新任務進程池和線程池的使用
- 背景:需要定時對數據庫的某一張表做更新
- 不管用多線程還是多進程只能利用當前一臺機器的計算能力,可以考慮使用celery這樣的工具,后期可以橫向擴展celery的執行機,也不用考慮生產者消費者模型,celery里面自動都幫我們處理好了,也有消息隊列的機制,我們只負責往里面丟任務即可
Django中connections.close_all()的作用
- 我們鏈接到mysql的時候,會創建一個鏈接,這個鏈接一般都有一個有效期,當新起一個進程的時候會fork父進程里的數據庫鏈接文件,但是這些鏈接文件可能馬上就失效了,萬一在我們子進程的任務中突然有一個鏈接失效就會報錯,所以在新起子進程的時候先執行一下這個命令,關閉舊鏈接,后面用了再創建自己的新鏈接即可
- 數據庫鏈接超時的報錯不光有mysql gone away,還有各種游標報錯,None類型報錯等,都可能是由于鏈接超時或者錯誤關閉鏈接導致
- 如果在子進程里使用了多進程,就會fork出好多鏈接文件,一不小心就會關閉還需要使用的鏈接,就會報錯,建議傳參的時候都穿hash_key,在子進程里再重新查詢獲取這個對象,這樣這個對象的生命周期就可以自己掌控了
- 但是創建多線程的時候不存在fork,基本不會有斷聯的情況
進程池的使用
參考:https://www.cnblogs.com/kaituorensheng/p/4465768.html
這個雖然使用的是Python2,但是給的例子里除了print加括號以外,都是可以正常使用的
#coding: utf-8 import multiprocessing import timedef func(msg):print("msg:", msg)time.sleep(3)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(processes = 3)for i in xrange(4):msg = "hello %d" %(i)pool.apply_async(func, (msg, )) #維持執行的進程總數為processes,當一個進程執行完畢后會添加新的進程進去print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join() #調用join之前,先調用close函數,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束print("Sub-process(es) done.")線程池的使用
參考:https://www.jianshu.com/p/b9b3d66aa0be
- 注意:進程池創建進程的時候,里面第二個參數是元祖,而創建線程池的時候,里面第二個參數就是普通的參數
總結
以上是生活随笔為你收集整理的Python3高并发定时更新任务进程池和线程池的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch查询相关总结以
- 下一篇: Django多进程中的查询错乱问题以及m