給出乙個任務,然後交給執行緒池完成,執行緒池可以設定最大執行緒的數量,所以他會一次執行三個
from concurrent.futures import threadpoolexecutor
import time
#簡單的執行緒池使用
def consume(num):
time.sleep(2)
print('consuming',num)
pools = threadpoolexecutor(3)
num = 1
while true:
time.sleep(0.5)
pools.submit(consume,(num))
num += 1
說明:
什麼是執行緒池,顧名思義就是首先把多個執行緒放入乙個池子中(記憶體),當有剩餘的執行緒的時候,我們就把執行緒取出來使用,如果沒有剩餘的執行緒,程式就會等待執行緒使用執行緒池我們可以獲取到任務的返回結果
from concurrent.futures import threadpoolexecutor
import time
#1.併發
#2.獲取執行緒的返回值 當乙個執行緒完成的時候,主線程能夠知道
#3.讓多執行緒和多程序程式設計介面一致
def get_html(sleep_time):
time.sleep(sleep_time)
print("get page {} success".format(sleep_time))
return sleep_time
executor = threadpoolexecutor(max_workers=2)
#通過sumbit提交到執行緒池中
task1 = executor.submit(get_html,(3))
task2 = executor.submit(get_html,(2))
task3 = executor.submit(get_html,(2))
print(task3.cancel())
#done 用於判斷是否完成
#print(task1.done())
#阻塞 等待任務完成獲取結果
print(task1.result())
print(task2.result())
from concurrent.futures import threadpoolexecutor, as_completed
import time
import random
from functools import partial
def get_html(sleep_time,num):
time.sleep(sleep_time)
# print("get page {} success".format(sleep_time))
return num
executor = threadpoolexecutor(max_workers=2)
#通過sumbit提交到執行緒池中
tasks = list()
for i in range(10):
sleep_time = random.randint(2, 5)
#把右邊函式看成乙個整體
#阻塞 等待完成的函式
for i in as_completed(tasks):
data = i.result()
print('num {} success'.format(data))
wait 阻塞主線程
wait可以等待tasks的某個任務或者所有任務完成之後再執行其他的(阻塞), 他有三種可選方式,預設是等待所有tasks完成
等待所有完成
等待第乙個完成
等待第乙個錯誤
first_completed = 'first_completed'
first_exception = 'first_exception'
all_completed = 'all_completed'
from concurrent.futures import threadpoolexecutor, as_completed, wait
import time
import random
def get_html(sleep_time):
time.sleep(sleep_time)
# print("get page {} success".format(sleep_time))
return sleep_time
executor = threadpoolexecutor(max_workers=2)
#通過sumbit提交到執行緒池中
tasks = list()
for i in range(10):
sleep_time = random.randint(2, 5)
#阻塞等待任務完成
wait(tasks, return_when='first_completed')
for i in as_completed(tasks):
data = i.result()
print('num {} success'.format(data))
print('12312312')
示例:
通過上面的執行緒池,我們就可以把獲取詳細頁面的任務交給執行緒池去獲取
import requests
from bs4 import beautifulsoup
from queue import queue
from threading import thread
from concurrent.futures import threadpoolexecutor
def get_html_doc(url):
# 根據指定的url獲取html文件
res = requests.get(url)
print('ex--->url',url)
return res.content.decode("utf8")
def get_detail(detail_urls_queue,pools):
while true:
url = detail_urls_queue.get(1,timeout=2)
# print('consumer--->',url)
pools.submit(get_html_doc,(url))
def parse_index(detail_urls_queue,index_urls_queue):
while true:
url = index_urls_queue.get(1)
# print('get_index_url--->',url)
# 解析列表頁面
html_doc = get_html_doc(url)
data = beautifulsoup(html_doc)
# 把index裡面的url取出來再取下面的url
# data.select呼叫css選擇器 選擇出來是dict
detail_urls = data.select('[class=post-thumb] a')
# 獲取細節的url,把細節的url交給其他執行緒處理
for i in detail_urls:
url = i['href']
# print('productor------>',url)
detail_urls_queue.put(url)
# 取出所有其他index頁面的翻頁url 去解析其他的url
index_urls = data.select('a[class=page-numbers]')
for i in index_urls:
url = i['href']
index_urls_queue.put(url)
#去重 使用redis資料庫
# print('put_index_url--->', url)
if __name__ == "__main__":
url = ""
# 詳細頁面的url
detail_urls = queue()
index_urls_queue = queue()
index_urls_queue.put(url)
# 列表url 防止重複
# index_urls_list =
executor = threadpoolexecutor(max_workers=10)
t1 = thread(target=parse_index,args=(detail_urls,index_urls_queue))
t2 = thread(target=get_detail, args=(detail_urls,executor))
t1.start()
t2.start()
t1.join()
t2.join()
print('down')
python 執行緒池 Python的執行緒池
usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...
python 執行緒池 python執行緒池原始碼解析
本篇主要講下threadpoolexecutor的實現。由於業務量不大,且一直使用框架進行程式設計,對執行緒的理解一直很模糊,基本處於不想阻塞程式執行,起乙個執行緒啟動任務的階段。總感覺自己好像會執行緒一樣,實則一直處於一種懵懂狀態,通過一段時間檢視一些別人寫的原始碼,終於有所悟,也記錄下自己的學習...
python執行緒池
import time threadpool為執行緒池模組 import threadpool deftest str print str time.sleep 2 if name main starttime time.time 建立執行緒池,最多建立的執行緒數為10 pool threadpoo...