使用os.popen()或子进程来执行函数

时间:2018-04-13 17:11:38

标签: python multithreading multiprocessing subprocess python-multiprocessing

我目前正在研究线程,多进程和os文档,以改进我的程序结构。但是老实说,有些内容很复杂,我无法让它在我的程序上实现,要么因为stackoverflow而崩溃,要么得到错误的输出或根本没有输出。所以这是我的问题。

假设我有一个传递给函数的名称列表,该函数是我想在另一个控制台中运行的 - 当然是python解释器。让它在一个完整的循环中运行。

假设我有这个:

def execute_function(name, arg1, arg2):
   While True:
       #do something

for name in names:
   execute_function(name, arg1, arg2)

我应该使用什么来运行这个函数以在python上以编程方式打开另一个控制台并在那里运行While True:是subproccess / multiprocess / threading还是os.popen()

在这个例子中我应该如何执行?多处理池和进程总是和我崩溃。所以我认为它不是正确的解决方案。到目前为止,我没有看到过将线程和子进程与函数一起使用的示例。这有解决方法吗?或许我可能错过了一个简单的解决方案?感谢。

编辑:

类似的代码:

     if symbols is not None and symbols1 is not None:

         symbols = [x for x in symbols if x is not None]
         symbols1 = [x for x in symbols1 if x is not None]
         if symbol != None and symbol in symbols and symbol in symbols1:
              with Pool(len(exchanges)) as p:
                   p.map(bot_algorithm, (a, b, symbol, expent,amount))

http://prntscr.com/j4viat - 错误是什么

1 个答案:

答案 0 :(得分:4)

subprocess 始终通常优先于os.system()

文档包含许多示例 - 在您的情况下,如果您想查看命令的结果,则execute_function()函数可能希望使用subprocess.check_output()

例如:

def execute_function(name, arg1, arg2):
  output = subprocess.check_output(["echo", name])
  print(output)

所有这一切确实是启动一个新进程,并等待它返回。虽然这在技术上是两个过程,但它并不完全是你所谓的多线程。

要使用同步运行多个子进程,您可以使用多处理库执行类似的操作:

from multiprocessing.dummy import Pool

def execute_function(name, arg1, arg2):
  return subprocess.check_output(["echo", name])

names = ["alex", "bob", "chrissy"]

pool = Pool()

map_results = pool.map(execute_function, names)

将迭代器(名称列表)映射到函数(execute_function)并立即运行它们。好吧,因为您的机器可以同时使用多个内核。 map_results是execute_function func。

的返回值列表