Python 執行緒池

2021-09-02 02:45:18 字數 4570 閱讀 2288

給出乙個任務,然後交給執行緒池完成,執行緒池可以設定最大執行緒的數量,所以他會一次執行三個

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...