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

รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ

ประยุกต์ใช้ตัวจัดการบริบทกับไฟล์ ล็อก ตัวจับเวลา และการเชื่อมต่อ DB

รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

บทนำ

ตัวจัดการบริบทช่วยแก้ปัญหาการจัดการทรัพยากรในโลกจริงได้อย่างสง่างาม ไม่ว่าจะเป็นไฟล์ ฐานข้อมูล ล็อก ตัวจับเวลา และอื่น ๆ

กระบวนการประมวลผลไฟล์

เปิดไฟล์อินพุตและเอาต์พุตพร้อมกัน ประมวลผลทีละบรรทัด และปิดไฟล์ทั้งสองโดยอัตโนมัติ
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

ธุรกรรมฐานข้อมูล

ครอบการดำเนินการกับฐานข้อมูลด้วย CM: ยืนยันธุรกรรมเมื่อสำเร็จ ย้อนกลับธุรกรรมเมื่อเกิดข้อยกเว้น และปิดทรัพยากรเสมอ
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

ล็อกสำหรับเธรด

ใน `with lock:` ระบบจะยึดล็อก เรียกใช้ส่วนเนื้อหา และปลดล็อกเมื่อออกจากบริบท จึงไม่จำเป็นต้องเรียกยึดหรือปลดล็อกด้วยตนเอง
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

การเปลี่ยนไดเรกทอรี

os.chdir() เปลี่ยนไดเรกทอรีทำงานทั่วทั้งโปรแกรม ตัวจัดการบริบทจะบันทึกค่าเดิมและคืนค่าให้
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

ไฟล์ชั่วคราว

tempfile.NamedTemporaryFile ในฐานะ CM จะสร้างและลบไฟล์ชั่วคราวโดยอัตโนมัติ
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

การปรับตัวแปรสภาพแวดล้อม

ตั้งค่าตัวแปรสภาพแวดล้อมชั่วคราวสำหรับการทดสอบหรือกระบวนการย่อย จากนั้นคืนค่าเดิม
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

ส่วนโค้ดสำหรับวัดประสิทธิภาพ

ครอบส่วนโค้ดด้วย cProfile เพื่อวัดประสิทธิภาพภายใน CM
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

ซ็อกเก็ตเครือข่าย

ซ็อกเก็ตใช้โพรโทคอล CM: `with socket.socket() as s:` จะปิดซ็อกเก็ตเมื่อออกจากบริบท
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

การดักจับคำเตือน

warnings.catch_warnings() ดักจับคำเตือนที่เกิดขึ้นภายในส่วนโค้ด ซึ่งมีประโยชน์ในการทดสอบ
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

การผสานรูปแบบ

CM ในโลกจริงมักผสานรูปแบบหลายอย่างเข้าด้วยกัน เช่น ธุรกรรม + การบันทึกเหตุการณ์ + การจับเวลา ในคอมโพเนนต์ที่นำกลับมาใช้ใหม่ได้เพียงตัวเดียว
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

ตรวจสอบอย่างรวดเร็ว

พรมีทีฟสำหรับการทำงานแบบเธรดใดที่ใช้โพรโทคอลตัวจัดการบริบทเพื่อให้เข้าถึงข้อมูลพร้อมกันได้อย่างปลอดภัย

สรุป

รูปแบบตัวจัดการบริบท ได้แก่ กระบวนการประมวลผลไฟล์ ธุรกรรมฐานข้อมูล ล็อก การเปลี่ยนไดเรกทอรี ไฟล์ชั่วคราว และการปรับตัวแปรสภาพแวดล้อม ใช้ ExitStack สำหรับสแตกทรัพยากรแบบไดนามิก

เรียนรู้ต่อไป

ทำได้ดีมาก บทเรียนถัดไปรอคุณอยู่

คำถามที่พบบ่อย

บทเรียน “รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ”

ประยุกต์ใช้ตัวจัดการบริบทกับไฟล์ ล็อก ตัวจับเวลา และการเชื่อมต่อ DB คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เจาะลึกคำสั่ง with
  2. โพรโทคอล __enter__ และ __exit__
  3. contextlib: @contextmanager
  4. รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ
← กลับไปที่ Python Academy