عند محاولة استخدامpool.map() لاستهداف وظيفة ذات معلمات متعددة، بما في ذلك كائن Lock()، يكون الأمر كذلك حاسم لمعالجة مشكلة مشاركة القفل بين العمليات الفرعية. لا يمكن تمرير المعالجة المتعددة التقليدية.Lock() مباشرة إلى أساليب التجمع بسبب قيود التخليل.
أحد الأساليب هو استخدام Manager() وإنشاء مثيل Manager.Lock(). على الرغم من أن هذه الطريقة يمكن الاعتماد عليها، إلا أنها تتضمن المزيد من الحمل بسبب العملية الإضافية التي تستضيف خادم المدير. بالإضافة إلى ذلك، تتطلب عمليات القفل الاتصال بهذا الخادم عبر IPC.
بدلاً من ذلك، يمكنك تمرير المعالجة المتعددة العادية.Lock() أثناء تهيئة المجمع باستخدام وسيطة الكلمة الأساسية للتهيئة. وهذا يضمن أن يكون مثيل القفل عالميًا في جميع الأطفال العاملين. تلغي هذه الطريقة ضرورة الوظائف الجزئية وتبسط العملية.
إليك مثال لاستخدام الخيار 2:
def target(iterable_item):
for item in items:
# Do cool stuff
if (... some condition here ...):
lock.acquire()
# Write to stdout or logfile, etc.
lock.release()
def init(l):
global lock
lock = l
def main():
iterable = [1, 2, 3, 4, 5]
l = multiprocessing.Lock()
pool = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(target, iterable)
pool.close()
pool.join()
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3