پرسش

چطور از multiprocessing.Pool.map با چندین آرگومان استفاده کنیم؟

How to use multiprocessing.Pool.map with multiple arguments?

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

1403/06/07
پاسخ
رضا دولتی عاشق برنامه نویسی و هوش مصنوعی!
بیوگرافی رضا دولتی

برای اینکه بتونی از multiprocessing.Pool.map با چندین آرگومان استفاده کنی، باید از تکنیکی به نام "unpacking" استفاده کنی. توی این روش، از تابع starmap یا یک lambda برای باز کردن آرگومان‌ها در حین اجرای تابع استفاده می‌کنی. در ادامه یه نمونه کد ساده آوردم که این مفهوم رو نشون می‌ده:

import multiprocessing
def multiply(x, y):
    # Multiply two numbers and return the result
    return x * y
if __name__ == '__main__':
    # Define the input data as a list of tuples
    data = [(1, 2), (3, 4), (5, 6), (7, 8)]
    # Create a Pool of worker processes
    with multiprocessing.Pool(processes=4) as pool:
        # Use starmap to apply the multiply function with multiple arguments
        results = pool.starmap(multiply, data)
    # Print the results
    print(results)
  1. تابع multiply دو آرگومان می‌گیره و نتیجه رو برمی‌گردونه.
  2. داده‌های ورودی به صورت یه لیست از تاپل‌ها تعریف می‌شن که هر تاپل شامل دو عدد هست.
  3. با استفاده از pool.starmap می‌تونی تابع multiply رو روی هر جفت از اعداد اعمال کنی.

اگه می‌خوای از map استفاده کنی، می‌تونی از lambda برای unpack کردن تاپل‌ها کمک بگیری:

import multiprocessing
def multiply(x, y):
    # Multiply two numbers and return the result
    return x * y
if __name__ == '__main__':
    # Define the input data as a list of tuples
    data = [(1, 2), (3, 4), (5, 6), (7, 8)]
    # Create a Pool of worker processes
    with multiprocessing.Pool(processes=4) as pool:
        # Use map with lambda to unpack the tuples
        results = pool.map(lambda p: multiply(*p), data)
    # Print the results
    print(results)

توی این روش هم، از lambda استفاده شده تا هر تاپل رو باز کنه و به عنوان آرگومان‌های مجزا به تابع multiply پاس بده. به این ترتیب، می‌تونی چندین آرگومان رو همزمان مدیریت کنی.

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

پاسخ: 1403/06/07
آخرین آپدیت: 1403/08/16