最近在做爬蟲,語音,視頻合成,需要使用多線程,多進程的模型。做個學習使用記錄。
使用多線程還是使用多進程,怎么樣來控制防止線程太多,導致線程失控,就是請求一個任務,生成一個進程,最終導致進程暴漲,進而無法控制。所以,對于任務數(shù)量一直在增加的程序,固定線程數(shù)量的線程池是必要的。
-
一些說明:
- 單進程因為處理過程中因為io或者密集計算導致延遲太多,耗時太多,運行一次太累。
- 使用多線程,多進程能一定程度的上解決這個問題,但是需要多少個線程(進程)這個需要詳細的測試。
-
最佳線程數(shù)的獲取:
過用戶慢慢遞增來進行性能壓測,觀察QPS(即每秒的響應請求數(shù),也即是最大吞吐能力。),響應時間
根據(jù)公式計算:服務器端最佳線程數(shù)量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數(shù)量
單用戶壓測,查看CPU的消耗,然后直接乘以百分比,再進行壓測,一般這個值的附近應該就是最佳線程數(shù)量。
-
對于io密集型模型
- 網(wǎng)絡io密集型線程和進程沒有明顯的一個差別,因為影響性能的主要在網(wǎng)絡延遲
- 磁盤的io密集型多線程性能要優(yōu)于多進程
- 自己寫多線程模塊
- python2,3中的多線程使用threadpool這個第三方模塊,模塊比較老了,用的人不多了
- python3中自帶的模塊concurrent.futures
主要說明第三種:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from concurrent.futures import ThreadPoolExecutor
import time
def get_content(url, type=1):
# print('begin')
time.sleep(2)
return 'url:{},type:{}'.format(url, type)
max_workers = 4
# 創(chuàng)建進程池
handler = ThreadPoolExecutor(max_workers=max_workers)
# f1 = handler.submit(get_content,'baidu.com',1)
# f2 = handler.submit(get_content,'movie.com',2)
urls = ['baidu.com','movie.com']
results = handler.map(get_content,urls)
for ret in results:
if ret.running():
print('ret:{},running'.format(ret))
進程池客戶使用submit或者map函數(shù)批量提交