خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه مدیریت منابع در پایتون با مدیران زمینه

از مدیریت کارآمد منابع با استفاده از مدیران زمینه در پایتون اطمینان حاصل کنید.

مدیریت صحیح منابع هنگام ساخت برنامه ها برای جلوگیری از نشت حافظه، اطمینان از پاکسازی مناسب و حفظ پایداری برنامه ها ضروری است. مدیران زمینه یک راه حل تصفیه شده برای این وضعیت ارائه می دهند. مدیران زمینه مدیریت منابع را با خودکارسازی فرآیند کسب و انتشار منابع ساده می کنند.

مدیران زمینه چیست؟

مدیر زمینه، در هسته خود، شی ای است که روش هایی را برای کسب و انتشار منابع در صورت نیاز تعریف می کند. مدیران زمینه مفید هستند زیرا می توانند مدیریت منابع را در ساختاری واضح، ساده و مختصر سازماندهی کنند. استفاده از مدیران زمینه ممکن است تکرار کد را کاهش دهد و خواندن کد شما را آسان‌تر کند.

برنامه ای را در نظر بگیرید که باید داده ها را در یک فایل ثبت کند. هر زمان که برنامه شما نیاز به لاگ کردن چیزی داشته باشد، باید به صورت دستی فایل گزارش را باز و بسته کنید زیرا مدیر زمینه وجود ندارد. با این حال، با استفاده از یک مدیر زمینه، راه‌اندازی و ساختارشکنی منابع ورود به سیستم را ساده می‌کنید و مدیریت صحیح کار ثبت را تضمین می‌کنید.

با بیانیه

دستور with در پایتون راهی برای استفاده از مدیران زمینه ارائه می دهد. حتی اگر در حین اجرای بلوک کد استثنا رخ دهد، اطمینان حاصل می‌کند که منابع به‌دست‌آمده پس از استفاده به‌عنوان مورد نظر، به‌طور مناسب آزاد می‌شوند.

with context_manager_expression as resource:
    # Code block that uses the resource
# Resource is automatically released when the block exits

با استفاده از عبارت with، به مدیر زمینه کنترل مدیریت منابع را می دهید و توجه شما را آزاد می کنید تا روی منطق برنامه خود تمرکز کنید.

استفاده از مدیران زمینه داخلی

پایتون مدیران زمینه داخلی را برای سناریوهای رایج ارائه می دهد. دو مثال را مشاهده خواهید کرد: مدیریت فایل با استفاده از تابع open() و مدیریت اتصالات شبکه با استفاده از ماژول سوکت.

مدیریت فایل با open()

تابع open() یک مدیریت زمینه داخلی است که برای کار با فایل ها استفاده می شود. اغلب برای خواندن یا نوشتن روی فایل ها استفاده می شود و یک شی فایل را برمی گرداند. هنگامی که از مدیر زمینه برای مدیریت فایل ها استفاده می کنید، با بستن خودکار فایل در زمانی که دیگر مورد نیاز نیست، از خراب شدن داده های احتمالی جلوگیری می کند.

with open('file.txt', 'r') as file:
    content = file.read()
    # Do something with content
# File is automatically closed after exiting the block

اتصالات شبکه با سوکت()

ماژول سوکت یک مدیر زمینه برای سوکت های شبکه فراهم می کند. مدیران زمینه می‌توانند هنگام کار با اتصالات شبکه، از راه‌اندازی و خرابی مناسب اطمینان حاصل کنند و از آسیب‌پذیری اتصال جلوگیری کنند.

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(('localhost', 8080))
    # Send/receive data over the socket
# Socket is automatically closed after exiting the block

پیاده سازی مدیران زمینه سفارشی

مدیران زمینه سفارشی به شما این امکان را می دهند که مدیریت منابع یا رفتارهای خاص را در کد خود کپسوله کنید. پایتون راه های مختلفی را برای ایجاد مدیران زمینه سفارشی ارائه می دهد که هر کدام برای سناریوهای مختلف مناسب هستند. در اینجا، رویکرد کلاس محور و تابع محور را بررسی خواهید کرد.

مطلب مرتبط:   8 مخزن GitHub که اکنون باید ستاره دار شوید!

مدیران زمینه با استفاده از رویکرد کلاس محور

در رویکرد کلاس محور، کلاسی را تعریف می کنید که متدهای جادویی یا dunder __enter__ و __exit__ را پیاده سازی می کند. متد __enter__ منبعی را که می‌خواهید مدیریت کنید، مقداردهی اولیه می‌کند و برمی‌گرداند، در حالی که روش __exit__ پاکسازی مناسب را حتی در صورت وجود استثناء تضمین می‌کند.

class CustomContext:
    def __enter__(self):
        # Acquire the resource
        return resource

    def __exit__(self, exc_type, exc_value, traceback):
        # Release the resource
        pass

کاری را در نظر بگیرید که در آن باید چندین فرآیند را اجرا کنید. این کار به یک مدیر زمینه نیاز دارد که اجرای همزمان همه فرآیندها را ساده کند. همچنین ایجاد، اجرا و ترکیب تمام فرآیندها را خودکار می کند و مدیریت صحیح منابع، هماهنگ سازی و مدیریت خطا را ارائه می دهد.

import multiprocessing
import queue

class ProcessPool:
    def __init__(self, num_processes):
        self.num_processes = num_processes
        self.processes = []

    def __enter__(self):
        self.queue = multiprocessing.Queue()

        for _ in range(self.num_processes):
            process = multiprocessing.Process(target=self._worker)
            self.processes.append(process)
            process.start()

        return self

    def __exit__(self, exc_type, exc_value, traceback):
        for process in self.processes:
            # Sending a sentinel value to signal worker processes to exit
            self.queue.put(None)
        for process in self.processes:
            process.join()

    def _worker(self):
        while True:
            number = self.queue.get()
            if number is None:
                break
            calculate_square(number)

def calculate_square(number):
    result = number * number
    print(f"The square of {number} is {result}")

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]

    # Usage
    with ProcessPool(3) as pool:
        for num in numbers:
            pool.queue.put(num)

    # Processes are automatically started and
    # joined when exiting the 'with' block

مدیر زمینه ProcessPool مجموعه‌ای از فرآیندهای کارگر را مدیریت می‌کند و وظایف (محاسبه مربع اعداد) را برای اجرای همزمان به این فرآیندها تقسیم می‌کند. این موازی‌سازی می‌تواند منجر به استفاده کارآمدتر از هسته‌های CPU موجود و اجرای بالقوه سریع‌تر وظایف نسبت به انجام متوالی آنها در یک فرآیند شود.

مطلب مرتبط:   نحوه پخش ویدیو با استفاده از اسکریپت پایتون

خروجی مدیر زمینه مبتنی بر کلاس

مدیران زمینه با استفاده از رویکرد مبتنی بر عملکرد

ماژول contextlib دکوراتور @contextmanager را برای ایجاد مدیران زمینه با استفاده از توابع مولد فراهم می کند. دکوراتورها به شما این امکان را می دهند که بدون تغییر عملکرد، عملکردی را به آن اضافه کنید.

در تابع مولد تزئین شده، می‌توانید از بازده و عبارت نهایی برای نشان دادن جایی که منبع به دست آمده و کجا باید آزاد شود استفاده کنید.

from contextlib import contextmanager

@contextmanager
def custom_context():
    # Code to acquire the resource
    resource = ...

    try:
        yield resource # Resource is provided to the with block
    finally:
        # Code to release the resource
        pass

فرض کنید می‌خواهید یک مدیریت زمینه ایجاد کنید که مدت زمان اجرای یک بلوک کد را محاسبه کند. شما می توانید این کار را با استفاده از یک استراتژی مبتنی بر عملکرد انجام دهید.

import time
from contextlib import contextmanager

@contextmanager
def timing_context():
    start_time = time.time()

    try:
        yield
    finally:
        end_time = time.time()
        elapsed_time = end_time - start_time
        print(f"Elapsed time: {elapsed_time} seconds")

# Usage
with timing_context():
    # Code block to measure execution time
    time.sleep(2)

در این مثال، مدیر زمینه timeing_context زمان شروع و پایان بلوک کد را ثبت می کند و زمان سپری شده هنگام خروج بلوک را محاسبه می کند.

خروجی مدیر زمینه مبتنی بر تابع

با استفاده از هر دو روش، می‌توانید مدیران زمینه سفارشی بسازید تا منطق پیچیده مدیریت منابع و عملیات‌های تکراری را کپسوله کنند و سازماندهی و قابلیت نگهداری کد خود را بهبود بخشند.

مدیران زمینه تودرتو

مدیران زمینه تودرتو هنگام برخورد با موقعیت هایی که نیاز به کنترل چندین منبع دارند، سودمند هستند. شما می توانید با تودرتو کردن زمینه ها و اطمینان از به دست آوردن و انتشار صحیح همه منابع، یک گردش کار واضح و بدون خطا را حفظ کنید.

مطلب مرتبط:   چگونه یک هدر چسبنده با CSS بسازیم

وضعیتی را در نظر بگیرید که برنامه شما باید داده ها را از یک فایل بخواند و آن را در پایگاه داده وارد کند. در این شرایط، شما باید دو منبع جداگانه را مدیریت کنید: فایل و اتصال پایگاه داده. تودرتوی مدیران زمینه می تواند این فرآیند را تسهیل کند:

import sqlite3

class DatabaseConnection:
    def __enter__(self):
        self.connection = sqlite3.connect('lite.db')
        return self.connection

    def __exit__(self, exc_type, exc_value, traceback):
        self.connection.close()

# Using nested context managers
with DatabaseConnection() as db_conn, open('data.txt', 'r') as file:
    cursor = db_conn.cursor()

    # Create the table if it doesn't exist
    cursor.execute("CREATE TABLE IF NOT EXISTS data_table (data TEXT)")

    # Read data from file and insert into the database
    for line in file:
        data = line.strip()
        cursor.execute("INSERT INTO data_table (data) VALUES (?)", (data,))

    db_conn.commit()

در این مثال، مدیر زمینه DatabaseConnection اتصال پایگاه داده را مدیریت می کند، در حالی که مدیر متن open() داخلی فایل را مدیریت می کند.

شما مطمئن می شوید که فایل و اتصال پایگاه داده به درستی با قرار دادن دو زمینه در یک عبارت واحد مدیریت می شوند. اگر در حین خواندن فایل یا درج پایگاه داده، استثنایی رخ دهد، هر دو منبع به درستی آزاد خواهند شد.

سفارشی کردن عملکردها با دکوراتورها

مدیریت موثر منابع یک نیاز حیاتی است. نشت منابع می تواند باعث نفخ حافظه، بی ثباتی سیستم و حتی نقص های امنیتی شود. شما دیده اید که چگونه مدیران زمینه راه حلی زیبا برای مشکلات مدیریت منابع ارائه می دهند.

Please turn AdBlock off