如何使用 Pythons Multiprocessing 库的 Process 类多次运行一个函数?

Posted

技术标签:

【中文标题】如何使用 Pythons Multiprocessing 库的 Process 类多次运行一个函数?【英文标题】:How can use the Process class of Pythons Multiprocessing library to run a function multiple times? 【发布时间】:2020-11-11 20:41:11 【问题描述】:

我有一个模拟化学反应随机系统的函数。我现在想使用 Pythons Multiprocessing 库中的 Process 类来多次运行随机模拟函数。

我尝试了以下方法:

v = range(1, 51)
def parallelfunc(v):     
    gillespie_tau_leaping(start_state, LHS, stoch_rate, state_change_array)


if __name__ == '__main__':
    start = datetime.utcnow()
    p = Process(target=parallelfunc, args=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50))
    p.start()    
    p.join()
    end = datetime.utcnow()
    sim_time = end - start
    print(f"Simualtion utc time:\nsim_time")

但这会导致错误TypeError: parallelfunc() takes 1 positional argument but 50 were given

然后我尝试将range(1, 51) 传递给parallelfunc 和进程的args 参数,但我只是在parallelfunc 减速时得到SyntaxError: invalid syntax

以这种方式使用parallelfunc 之类的函数的方法在使用pool.map 时有效,我只需传递parallelfunc 后跟一个从1 到50 的列表。

但我不知道这里出了什么问题。

任何建议 干杯。

【问题讨论】:

【参考方案1】:

我认为错误是因为您将 50 个参数作为并行函数的参数,而您将其定义为只有一个参数。也许尝试添加 list() 所以它只有一个参数,其中包含 50 个数字。不过不知道是不是数字多。

【讨论】:

【参考方案2】:

那是因为你给出了太多的论据。 试试

def parallelfunc(*v):     
     gillespie_tau_leaping(start_state, LHS, stoch_rate, state_change_array)

这允许你接受多个参数

【讨论】:

如果你愿意,你可以用**代替*

以上是关于如何使用 Pythons Multiprocessing 库的 Process 类多次运行一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pythons内置map和reduce函数计算字符串中的字母频率

如何将 pythons Decimal() 类型转换为 INT 和指数

如何在 openSUSE 上安装 Pythons MySQLdb 模块?

Pythons HTMLParser 可以编辑/更改 HTML 元素 innerText 还是只读取它

FFMPEG 和 Pythons 子进程

使用 Pythons imaplib 搜索之前/之后