ThreadPoolExecutor
เรียกใช้งานพร้อมกัน
ThreadPoolExecutor เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้กลุ่มเธรด
การสร้างและรอเธรดด้วยตนเองเป็นเรื่องยุ่งยาก concurrent.futures.ThreadPoolExecutor จะจัดการกลุ่มเธรดผู้ปฏิบัติงานให้คุณ และคืนผลลัพธ์อย่างเป็นระเบียบ
from concurrent.futures import ThreadPoolExecutor
def square(n):
return n * n
with ThreadPoolExecutor() as ex:
future = ex.submit(square, 5)
print(future.result())submit และผลลัพธ์ในอนาคต
submit() จะจัดกำหนดการเรียกใช้และคืนค่าผลลัพธ์ในอนาคตทันที คุณเรียก .result() เพื่อรับค่าได้ โดยการเรียกจะรอจนกว่าค่าจะพร้อม
from concurrent.futures import ThreadPoolExecutor
def greet(name):
return 'hi ' + name
with ThreadPoolExecutor(max_workers=2) as ex:
f1 = ex.submit(greet, 'Ana')
f2 = ex.submit(greet, 'Bob')
print(f1.result())
print(f2.result())map สำหรับข้อมูลนำเข้าหลายรายการ
executor.map(func, iterable) จะเรียกใช้ฟังก์ชันกับทุกรายการพร้อมกัน และส่งคืนผลลัพธ์ตามลำดับข้อมูลนำเข้า
from concurrent.futures import ThreadPoolExecutor
def cube(n):
return n ** 3
with ThreadPoolExecutor() as ex:
results = ex.map(cube, range(5))
print(list(results))การควบคุมจำนวนผู้ปฏิบัติงาน
max_workers จะจำกัดจำนวนเธรดที่ทำงานพร้อมกัน สำหรับงานที่รอ I/O คุณสามารถใช้ผู้ปฏิบัติงานมากกว่าจำนวนแกน CPU ได้
from concurrent.futures import ThreadPoolExecutor
import time
def io_task(n):
time.sleep(0.05)
return n
start = time.perf_counter()
with ThreadPoolExecutor(max_workers=4) as ex:
print(list(ex.map(io_task, range(4))))
print('ran concurrently')as_completed
as_completed(futures) จะส่งคืนผลลัพธ์ในอนาคตแต่ละรายการทันทีที่ทำงานเสร็จ โดยไม่ขึ้นกับลำดับการส่งงาน เหมาะอย่างยิ่งสำหรับการประมวลผลผลลัพธ์ทันทีที่มาถึง
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
def work(n):
time.sleep(0.01 * (3 - n))
return n
with ThreadPoolExecutor() as ex:
futures = [ex.submit(work, i) for i in range(3)]
for f in as_completed(futures):
print('finished', f.result())การจัดการข้อยกเว้น
หาก task ทำให้เกิดข้อยกเว้น ข้อยกเว้นนั้นจะถูกเก็บไว้ในผลลัพธ์ในอนาคต และจะถูกส่งกลับมาอีกครั้งเมื่อคุณเรียก .result() ให้ครอบการเรียกนั้นด้วย try/except
from concurrent.futures import ThreadPoolExecutor
def risky(n):
if n == 0:
raise ValueError('cannot be zero')
return 10 // n
with ThreadPoolExecutor() as ex:
f = ex.submit(risky, 0)
try:
print(f.result())
except ValueError as e:
print('caught:', e)การใช้ map กับอาร์กิวเมนต์หลายตัว
map รับสิ่งที่วนซ้ำได้หลายรายการและจับคู่สิ่งเหล่านั้นเป็นอาร์กิวเมนต์ เช่นเดียวกับ map ที่มีมาให้ในตัว
from concurrent.futures import ThreadPoolExecutor
def add(a, b):
return a + b
with ThreadPoolExecutor() as ex:
print(list(ex.map(add, [1, 2, 3], [10, 20, 30])))การรวบรวมผลลัพธ์ในพจนานุกรม
รูปแบบที่ใช้กันทั่วไปคือจับคู่ผลลัพธ์ในอนาคตแต่ละรายการกลับไปยังข้อมูลนำเข้าของรายการนั้น เพื่อให้ทราบว่าผลลัพธ์ใดเป็นของข้อมูลใดเมื่อใช้ as_completed
from concurrent.futures import ThreadPoolExecutor, as_completed
def length(word):
return len(word)
words = ['cat', 'tiger', 'ox']
with ThreadPoolExecutor() as ex:
future_to_word = {ex.submit(length, w): w for w in words}
out = {}
for f in as_completed(future_to_word):
out[future_to_word[f]] = f.result()
print(sorted(out.items()))การปิดตัวจัดการบริบท
การใช้ตัวดำเนินการในบล็อก with จะเรียก shutdown() โดยอัตโนมัติ และรอให้ task ที่รอดำเนินการทั้งหมดเสร็จสิ้น
from concurrent.futures import ThreadPoolExecutor
def job(n):
return n * 2
with ThreadPoolExecutor() as ex:
futures = [ex.submit(job, i) for i in range(3)]
print('all tasks done after the with block')
print([f.result() for f in futures])การตรวจสอบสถานะผลลัพธ์ในอนาคต
ผลลัพธ์ในอนาคตมี .done() และ .running() ให้ใช้ตรวจสอบความคืบหน้าโดยไม่ต้องรอ
from concurrent.futures import ThreadPoolExecutor
def quick(n):
return n + 1
with ThreadPoolExecutor() as ex:
f = ex.submit(quick, 41)
result = f.result()
print('done?', f.done())
print('value:', result)ควรใช้เมื่อใด
ThreadPoolExecutor เหมาะอย่างยิ่งกับ task ขนาดเล็กจำนวนมากที่รอ I/O เช่น การเรียก HTTP การอ่าน file และการค้นหาข้อมูลในฐานข้อมูล สำหรับงานที่ใช้ CPU ให้ใช้ ProcessPoolExecutor แทน
from concurrent.futures import ThreadPoolExecutor
urls = ['a', 'b', 'c']
def fetch(u):
return 'fetched ' + u
with ThreadPoolExecutor(max_workers=3) as ex:
for r in ex.map(fetch, urls):
print(r)ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ ThreadPoolExecutor
ทบทวน
คุณได้เรียนรู้เกี่ยวกับ ThreadPoolExecutor:
submit()ส่งคืน Future ส่วนmap()จะทำงานกับอ็อบเจ็กต์ที่วนซ้ำได้ตามลำดับas_completed()จะส่งคืนฟิวเจอร์เมื่อแต่ละรายการทำงานเสร็จ- ข้อยกเว้นจะแสดงผ่าน
result() - บล็อก
withจะจัดการการปิดการทำงาน
ถัดไป: การทำงานแบบขนานอย่างแท้จริงด้วยการประมวลผลหลายกระบวนการ
คำถามที่พบบ่อย
บทเรียน “ThreadPoolExecutor” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ThreadPoolExecutor” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ThreadPoolExecutor”
เรียกใช้งานพร้อมกัน คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ThreadPoolExecutor” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เธรดและ GIL
- ThreadPoolExecutor
- พื้นฐาน multiprocessing
- การแบ่งปันข้อมูลอย่างปลอดภัย