0Pricing
Python Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เธรดและ GIL
  2. ThreadPoolExecutor
  3. พื้นฐาน multiprocessing
  4. การแบ่งปันข้อมูลอย่างปลอดภัย
← กลับไปที่ Python Academy