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