ضمان إدارة الموارد بكفاءة باستخدام مديري السياق في بايثون.

من الضروري إدارة الموارد بشكل صحيح عند إنشاء التطبيقات لمنع تسرب الذاكرة، وضمان التنظيف المناسب، والحفاظ على استقرار تطبيقاتك. يقدم مديرو السياق حلاً محسّنًا لهذا الموقف. يقوم مديرو السياق بتبسيط إدارة الموارد عن طريق أتمتة عملية الحصول على الموارد وإصدارها.

ما هي مديري السياق؟

مدير السياق، في جوهره، هو كائن يحدد طرق الحصول على الموارد وإصدارها حسب الحاجة. يعد مديرو السياق مفيدًا حيث يمكنهم تنظيم إدارة الموارد في بنية واضحة وبسيطة وموجزة. قد يؤدي استخدام مديري السياق إلى تقليل تكرار التعليمات البرمجية وتسهيل قراءة التعليمات البرمجية الخاصة بك.

فكر في برنامج يجب عليه تسجيل البيانات في ملف. عندما يحتاج تطبيقك إلى تسجيل شيء ما، يجب عليك فتح ملف السجل وإغلاقه يدويًا لأنه لا يوجد مدير سياق. ومع ذلك، باستخدام مدير السياق، يمكنك تبسيط عملية إعداد وتفكيك موارد التسجيل، مما يضمن المعالجة السليمة لمهمة التسجيل.

مع البيان

ال مع توفر العبارة في Python طريقة لاستخدام مديري السياق. حتى إذا حدثت استثناءات أثناء تنفيذ كتلة التعليمات البرمجية، فهذا يضمن تحرير الموارد التي تم الحصول عليها بشكل مناسب بعد استخدامها على النحو المنشود.

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

من خلال الاستفادة من مع البيان، فأنت تمنح مدير السياق السيطرة على إدارة الموارد، مما يحرر انتباهك للتركيز على منطق التطبيق الخاص بك.

استخدام مديري السياق المدمجين

تقدم Python مديري سياقات مضمنين للسيناريوهات الشائعة. سترى مثالين: معالجة الملفات باستخدام ملف يفتح() وظيفة وإدارة اتصالات الشبكة باستخدام قابس كهرباء وحدة.

التعامل مع الملفات باستخدام 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

تنفيذ مديري السياق المخصص

يسمح لك مديرو السياق المخصصون بتغليف إدارة موارد أو سلوكيات معينة داخل التعليمات البرمجية الخاصة بك. توفر لغة Python طرقًا مختلفة لإنشاء مديري سياقات مخصصين، كل منها يناسب سيناريوهات مختلفة. هنا، سوف تستكشف النهج القائم على الفصل والوظيفة.

مديرو السياق باستخدام النهج القائم على الفصل

في النهج القائم على الطبقة، قمت بتحديد فئة الذي ينفذ __يدخل__ و __مخرج__طرق السحر أو الدندر. ال __يدخل__ تقوم الطريقة بتهيئة وإرجاع المورد الذي تريد إدارته، بينما __مخرج__ تضمن الطريقة التنظيف المناسب، حتى في حالة وجود استثناءات.

classCustomContext:
def__enter__(self):
# Acquire the resource
return resource

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

فكر في مهمة حيث يجب عليك تشغيل عدة عمليات. تتطلب هذه المهمة مدير سياق يعمل على تبسيط التنفيذ المتزامن لجميع العمليات. كما سيقوم أيضًا بأتمتة إنشاء جميع العمليات وتنفيذها والجمع بينها، مما يوفر الإدارة الصحيحة للموارد والمزامنة وإدارة الأخطاء.

import multiprocessing
import queue

classProcessPool:
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):
whileTrue:
number = self.queue.get()
if number isNone:
break
calculate_square(number)

defcalculate_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 يدير مدير السياق مجموعة من العمليات المنفذة، ويوزع المهام (حساب مربعات الأرقام) على هذه العمليات للتنفيذ المتزامن. يمكن أن يؤدي هذا التوازي إلى استخدام أكثر كفاءة لنوى وحدة المعالجة المركزية المتوفرة وربما تنفيذ المهام بشكل أسرع من تنفيذها بشكل تسلسلي في عملية واحدة.

مديرو السياق باستخدام النهج القائم على الوظيفة

ال contextlib توفر الوحدة @contextmanager مصمم لإنشاء مديري السياق باستخدام وظائف المولد. تسمح لك أدوات الديكور بإضافة وظائف إلى وظيفة دون تعديلها.

ضمن وظيفة المولد المزخرف، يمكنك استخدام أَثْمَر و أخير بيان للإشارة إلى مكان الحصول على المورد والمكان الذي يجب إصداره فيه.

from contextlib import contextmanager

@contextmanager
defcustom_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
deftiming_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)

في هذا المثال، Timing_context يسجل مدير السياق وقت البدء والانتهاء لكتلة التعليمات البرمجية ويحسب الوقت المنقضي عند خروج الكتلة.

باستخدام أي من الطريقتين، يمكنك إنشاء مديري سياقات مخصصين لتغليف منطق إدارة الموارد المعقد والعمليات المتكررة، مما يؤدي إلى تحسين تنظيم التعليمات البرمجية وقابلية صيانتها.

مدراء سياق التداخل

يعتبر مديرو سياق التداخل مفيدين عند التعامل مع المواقف التي تتطلب التحكم في العديد من الموارد. يمكنك الحفاظ على سير عمل واضح وخالي من الأخطاء من خلال تداخل السياقات والتأكد من الحصول على جميع الموارد وإصدارها بشكل صحيح.

ضع في اعتبارك موقفًا حيث يجب على برنامجك قراءة البيانات من ملف وإدراجها في قاعدة البيانات. في هذه الحالة، يجب عليك إدارة مصدرين منفصلين: الملف واتصال قاعدة البيانات. يمكن لتداخل مديري السياق تسهيل هذه العملية:

import sqlite3

classDatabaseConnection:
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()

في هذا المثال، اتصال قاعدة البيانات يتولى مدير السياق التعامل مع اتصال قاعدة البيانات، في حين أن المدمج في يفتح() مدير السياق يتعامل مع الملف.

عليك التأكد من إدارة الملف واتصال قاعدة البيانات بشكل مناسب عن طريق تداخل السياقين في عبارة واحدة. سيتم تحرير كلا الموارد بشكل صحيح في حالة حدوث استثناء أثناء قراءة الملف أو إدراج قاعدة البيانات.

تخصيص الوظائف مع الديكور

الإدارة الفعالة للموارد هي مطلب حيوي. يمكن أن يتسبب تسرب الموارد في تضخم الذاكرة وعدم استقرار النظام وحتى حدوث عيوب أمنية. لقد رأيت كيف يقدم مديرو السياق حلاً أنيقًا لمشاكل إدارة الموارد.