اذهب إلى المحتوى
  • 0

استخدام أكثر من مدخل في مكتبة multiprocessing في بايثون

Fahmy Mostafa

السؤال

أحاول القيام ببرنامج متعدد المهام من خلال pool.map في مكتبة multiprocessing لكن المشكلة هي أنه يمكنني تمرير مدخل واحد إلى الدالة التي أريد، كالتالي:

def test(x, y):
   print(x + y)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=2)
    pool.map(test, range(1000))    # يجب أن يتم تمرير رقمين للدالة وليس رقم واحد
    pool.close()
    pool.join()

كيف أقوم بتمرير أكثر من متغير إلى دالة test؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكن تمرير أكثر من وسيط للدالة map ونضع بينهم فاصلة كالتالي:

pool.map(test, x, y)

في حالات أخرى، يمكن تمرير قائمة تحوي على tuple وبالمرور على القائمة يتم استدعاء دالة الجمع لكل عنصر tuple منها كالتالي:

def multi_run_wrapper(args):
   return add(*args)       # تمرير عناصر الوسيط كمتغيرات منفصلة

def add(x,y):
    return x+y

if __name__ == "__main__":
    from multiprocessing import Pool
    pool = Pool(4)

	# استدعاء دالة تقوم باستخلاص العناصر من القائمة
    results = pool.map(multi_run_wrapper,[(1,2),(2,3),(3,4)])
    print results


output::

[3, 5, 7]

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لحل هذه المشكلة في النسخ الحديثة من إصدار 3.3 ومافوق تستطيع إستخدام دالة Pool.starmap والذي تقبل سلسلة من المُدخلات ، ومن ثم ستقوم بتمرير المُدخلات تلقائياً الى الدالة المراد إعطائها المُدخلات ، كما هو موضح في المثال

import multiprocessing
from itertools import product

def merge_names(a, b):
    return '{} & {}'.format(a, b)

if __name__ == '__main__':
    names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
    with multiprocessing.Pool(processes=3) as pool:
        results = pool.starmap(merge_names, product(names, repeat=2))# تمرير الدالة مع المُدخلات
    print(results)

أما للنسخ الأقدم فستحتاج الى كتابة دالة مساعدة كما في المثال

import multiprocessing
from itertools import product
from contextlib import contextmanager

def merge_names(a, b):
    return '{} & {}'.format(a, b)

def merge_names_unpack(args):
    return merge_names(*args)

@contextmanager
def poolcontext(*args, **kwargs):
    pool = multiprocessing.Pool(*args, **kwargs)
    yield pool
    pool.terminate()

if __name__ == '__main__':
    names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
    with poolcontext(processes=3) as pool:
        results = pool.map(merge_names_unpack, product(names, repeat=2)) # تمرير الدالة المساعدة مع المُدخلات
    print(results)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اعتقد أنك تحتاج إلى حل أكثر أناقة ونظافة وراحة للعين:

# نعرف تابع يأخذ 3 وسطاء ويرد محموعهم
def func(arguments):
    ali, eyad, Thyme = arguments[0] , arguments[1] , arguments[2]
    return ali+eyad+Thyme
# نعرف الدالة الرئيسية
if __name__ == "__main__":
    import multiprocessing
    pool = multiprocessing.Pool(4) 
    # تمرير 3 وسطاء
    out = pool.map(func, [ [1,2,3] ])
    print(out)
# الخرج
# [6]

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...