【问题标题】:Is there a way to automate calling a function multiple times with different args?有没有办法用不同的参数自动调用一个函数多次?
【发布时间】:2020-05-09 22:04:18
【问题描述】:

我正在尝试启动多个进程,每次都针对具有不同参数的函数,我想知道是否有更方便的方法来编写:

if __name__ == "__main__":    
    p1 = multiprocessing.Process(target=get_articles, args=[1, 101, 1])
    p2 = multiprocessing.Process(target=get_articles, args=[101, 201, 2])
    p3 = multiprocessing.Process(target=get_articles, args=[201, 301, 3])
    p4 = multiprocessing.Process(target=get_articles, args=[301, 401, 4])
    p5 = multiprocessing.Process(target=get_articles, args=[401, 501, 5])
    p6 = multiprocessing.Process(target=get_articles, args=[501, 601, 6])
    p7 = multiprocessing.Process(target=get_articles, args=[601, 701, 7])
    p8 = multiprocessing.Process(target=get_articles, args=[701, 801, 8])
    p9 = multiprocessing.Process(target=get_articles, args=[801, 901, 9])
    p10 = multiprocessing.Process(target=get_articles, args=[901, 1001, 10])
    p11 = multiprocessing.Process(target=get_articles, args=[1001, 1101, 11])
    p12 = multiprocessing.Process(target=get_articles, args=[1101, 1201, 12])
    p13 = multiprocessing.Process(target=get_articles, args=[1201, 1301, 13])
    p14 = multiprocessing.Process(target=get_articles, args=[1301, 1401, 14])
    p15 = multiprocessing.Process(target=get_articles, args=[1401, 1501, 15])
    p16 = multiprocessing.Process(target=get_articles, args=[1501, 1601, 16])
    p17 = multiprocessing.Process(target=get_articles, args=[1601, 1701, 17])



    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    p6.start()
    p7.start()
    p8.start()
    p9.start()
    p10.start()
    p11.start()
    p12.start()
    p13.start()
    p14.start()
    p15.start()
    p16.start()
    p17.start()

【问题讨论】:

  • 您可以在列表中添加参数并在for 循环中启动进程。

标签: python python-multiprocessing


【解决方案1】:
processes = [ multiprocessing.Process(target=get_articles, args=[i*100-99, i*100+1, i]) for i in range(1,18) ]
for p in processes:
    p.start()

【讨论】:

    【解决方案2】:

    要回答您最初的问题,functools 模块中有一个名为 partial 的函数。它需要一个函数作为第一个参数,然后是在调用时传递给该函数的位置和关键字参数。它返回一个函数,该函数将使用预先保存的参数和您提供的任何新参数来执行。当您希望始终传递一些参数但更改其他参数时,它会很有帮助。

    这是documentationpartial

    这是一个例子:

    from functools import partial
    
    def exclaim(a, b):
        print("{} {}!".format(a, b))
    
    # This is a function   
    happy_birthday = partial(exclaim, "Happy Birthday")
    
    happy_birthday("Bob")
    happy_birthday("Alice")
    

    partial 的使用应用于您的情况,我想您可以使用以下内容:

    # Declare this outside of a loop
    threaded_get_process = partial(Process, target=get_articles)
    
    # Call this in a loop where you iterate over a list of the arguments to pass into the threaded call
    threaded_get_process(args=arg_items)
    

    但是,对于您的用例,有一种更简单的方法。不一定需要partial 函数。您可以遍历参数列表。

    from multiprocessing import Process
    
    def get_articles(one, two, three):
        # Just for testing. Replace with your actual function
        print("{} {} {}".format(one, two, three))
    
    params = [
        [1, 101, 1],
        [101, 201, 2],
        [201, 301, 3],
        [301, 401, 4],
        [401, 501, 5],
        [501, 601, 6],
        [601, 701, 7],
        [701, 801, 8],
        [801, 901, 9],
        [901, 1001, 10],
        [1001, 1101, 11],
        [1101, 1201, 12],
        [1201, 1301, 13],
        [1301, 1401, 14],
        [1401, 1501, 15],
        [1501, 1601, 16],
        [1601, 1701, 17]
    ]
    
    for param in params:
        new_thread = Process(target=get_articles, args=param)
        new_thread.start()
    
    

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 1970-01-01
      • 2021-08-06
      • 2017-02-11
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多