【问题标题】:limit threads of a program with for loops使用 for 循环限制程序的线程
【发布时间】:2017-10-10 23:32:25
【问题描述】:

我写了下面的代码,使用 subprocess 方法运行命令,在 2 个 for 循环下,

import threading
import subprocess

def do (i,j):
    subprocess.Popen(['python2.7 some_python_code.py {} {}'.format(i,j)],shell=True,stdout=subprocess.PIPE)

z=[]
for i in range (0,50):
    for j in range (0,50):
        t = threading.Thread(target=do, args=(i,j))
        t.start()
        z.append(t)

for t in z:
    t.join()

问题是它突然启动了大量的python进程并吃掉了我的全部内存,我该如何限制线程数?

谢谢。

【问题讨论】:

  • (1) subprocess.Popen() 在进程运行时立即返回。您必须wait 才能终止它。 (2) 对于线程创建,请查看ThreadPoolExecutor 以限制线程数。
  • 我认为 subprocess.call 等待结果,但它是串行过程,而不是并行过程。谢谢

标签: python multithreading python-2.7 python-3.x


【解决方案1】:

也许如果您使用选项 setDaemon 可以改善问题,我将在此处放置参考链接,请阅读 Daemon vs noDaemon 部分。 https://pymotw.com/2/threading/

默认情况下此选项未激活,您可以通过以下方式激活:

daemon_thread = threading.Thread(name='MyDaemon', target=do_some_stuff)
daemon_thread.setDaemon(True)

如果第一个选项不能解决问题可以查看以下链接How to reduce memory usage of threaded python code?希望链接可以帮助到你,祝你好运!

【讨论】:

  • 非常感谢 Jose,问题是它同时运行 50*50 进程。
  • 那么你需要使用多处理,线程不要以并行方式执行作业,如果你想要并行作业你需要使用多处理
【解决方案2】:

您应该使用concurrent.futures - 它会自动创建所需大小的工作池,按顺序提交任务。

此外,您必须将您的 subprocess 调用更改为阻塞 - 如果 do 函数立即返回,则使用池将无济于事。

import concurrent.futures

import subprocess
import sys

def do (i,j):
    subprocess.Popen(['python2.7 some_python_code.py {} {}'.format(i,j)],shell=True,stdout=subprocess.PIPE)

with concurrent.futures.ThreadPoolExecutor(max_workers=8) as pool:
    for i in range (0,50):
        for j in range (0,50):
            t = pool.submit(do, i,j)

   for task in concurrent.future.as_completed(pool):
        try:
            result = task.result()
        except Exception as error:
            print(f"Error executing task '{task}': {error}", file=sys.stderr) 

【讨论】:

  • subprocess.Popen() 立即返回,因此任务在进程运行时完成。
  • 谢谢。我添加了一个段落来反映这一点 - OP 应该对那个调用提出修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多