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

السؤال

نشر

أحاول القيام ببرنامج متعدد المهام من خلال 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...