使用for循环限制程序的线程

时间:2017-10-10 00:22:17

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

我编写了以下代码,使用子进程方法运行命令,2 for 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进程并吃掉了我的整个内存,我怎样才能限制线程的数量?

感谢。

2 个答案:

答案 0 :(得分: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?我希望该链接可以帮助您,祝您好运!

答案 1 :(得分:1)

您应该使用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)