【问题标题】:Is there a way to execute multiple functions at the same time, but from a list?有没有办法同时执行多个功能,但从一个列表?
【发布时间】:2018-11-07 21:18:49
【问题描述】:

我想询问用户输入,然后将所有输入存储到一个列表中。输入将与我定义的函数的拼写完全相同。

inp =  raw_input("functions you want to execute, sep by commas:")
alist = []
for j in inp.split(','):
    alist.append(j)
def func1():
    print 'FUNCTION 1'

def func2():
    print 'FUNCTION 2'

def func3():
    print 'FUNCTION 3'

for i in alist:
    eval(i+'()') #I want to do this but all at the same time

在这种情况下,当要求输入时,我希望执行所有 3 个函数,列表将如下所示:

['func1','func2','func3']

我想做的是同时执行它们。

我考虑过多处理,但我不知道如何从列表中进行。

另外,请不要跟我讲我对 eval() 的用法,这段代码是用于分子动力学模拟的。

【问题讨论】:

  • 为每个函数创建一个进程,然后在所有进程对象被构造(,初始化等等..)之后启动它们。但鉴于您的函数非常短,很可能一个函数会在另一个函数开始之前结束。至于获取对象(根据其名称),您可以使用类似:globals()["func1"]()(这也称为它),具体取决于函数的定义方式/位置。
  • 请不要随便使用eval:stackoverflow.com/q/1832940/1025391

标签: python multithreading multiprocessing


【解决方案1】:

您可以使用multiprocessing 模块

from multiprocessing import Process

def A():
  print("A")

def B():
  print("B")

def runAll(fns):
  proc = []
  for fnName in fns:
    fn = globals()[fnName]
    p = Process(target=fn)
    p.start()
    proc.append(p)
  for p in proc:
    p.join()

然后你这样称呼他们:

runAll(['A','B'])

如果函数未在同一模块中定义,则将 globals 行 (globals()...) 替换为:

fn = getattr(module, fnName)

在这里试试:Repl.it


附带说明,允许用户调用任意函数是个坏主意(安全方面)。相反,您可以明确地只接受来自预定义字符串列表的操作。

【讨论】:

  • 在运行 runAll 时,我可以输入列表的名称吗?例如 runAll(alist)?
  • 您的意思是alist=["A","B"]; runAll(alist) 还是runAll("alist")?你已经可以用当前的例子做第一个了
  • TypeError: 'str' 对象不可调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多