有没有办法用不同的参数多次自动调用一个函数?
Is there a way to automate calling a function multiple times with different args?
我每次都尝试启动多个针对具有不同参数的函数的进程,我想知道是否有更方便的写法:
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()
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()
要回答您原来的问题,functools
模块中有一个名为 partial
的函数。它需要一个函数作为第一个参数,然后是在调用时传递给该函数的位置和关键字参数。它 returns 一个将使用预先保存的参数和您提供的任何新参数执行的函数。当您希望始终传递一些参数但更改其他参数时,它会很有帮助。
这是 partial
的 documentation。
这是一个例子:
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()
我每次都尝试启动多个针对具有不同参数的函数的进程,我想知道是否有更方便的写法:
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()
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()
要回答您原来的问题,functools
模块中有一个名为 partial
的函数。它需要一个函数作为第一个参数,然后是在调用时传递给该函数的位置和关键字参数。它 returns 一个将使用预先保存的参数和您提供的任何新参数执行的函数。当您希望始终传递一些参数但更改其他参数时,它会很有帮助。
这是 partial
的 documentation。
这是一个例子:
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()