GitPython 导致 concurrent.futures.ThreadPoolExecutor 忽略 max_workers
GitPython causes concurrent.futures.ThreadPoolExecutor to ignore max_workers
我正在编写一些 Python 代码来对大量 git 存储库并行执行操作。为此,我尝试结合 concurrent.futures and GitPython,将每个存储库克隆到一个单独的未来任务中。这是在 OS X 10.10 上使用内置的 Python 2.7.6,并使用 GitPython 0.3.5 和 futures 2.2.0(版本向后移植到2.7) 都通过 pip 安装。
我使用的代码的一个简单示例如下:
import time
from concurrent import futures
import shutil
import os
from git import Repo
def wait_then_return(i):
print('called: %s', i)
time.sleep(2)
return i
def clone_then_return(i):
print('called: %s', i)
path = os.path.join('/tmp', str(i))
os.mkdir(path)
# clone some arbitrary repo
Repo.clone_from('https://github.com/ros/rosdistro', path)
shutil.rmtree(path)
return i
if __name__ == "__main__":
tasks = 20
workers = 4
with futures.ThreadPoolExecutor(max_workers=workers) as executor:
# this works as expected... delaying work until a thread is available
# fs = [executor.submit(wait_then_return, i) for i in range(0, tasks)]
# this doesn't... all 20 come in quick succession
fs = [executor.submit(clone_then_return, i) for i in range(0, tasks)]
for future in futures.as_completed(fs):
print('result: %s', future.result())
当我将 wait_then_return
函数提交给执行程序时,我得到了预期的行为:打印首先以四人为一组完成,然后大致沿着这些路线完成,直到所有期货都完成。如果我将其切换为 clone_then_return
那么它看起来好像 执行者忽略了 max_workers 参数并并行运行所有二十个期货。
这可能是什么原因?
实际上,我使用的 git 调用存在一些身份验证问题,导致 future 快速完成。在并发的世界里,一切仍然理智。
我正在编写一些 Python 代码来对大量 git 存储库并行执行操作。为此,我尝试结合 concurrent.futures and GitPython,将每个存储库克隆到一个单独的未来任务中。这是在 OS X 10.10 上使用内置的 Python 2.7.6,并使用 GitPython 0.3.5 和 futures 2.2.0(版本向后移植到2.7) 都通过 pip 安装。
我使用的代码的一个简单示例如下:
import time
from concurrent import futures
import shutil
import os
from git import Repo
def wait_then_return(i):
print('called: %s', i)
time.sleep(2)
return i
def clone_then_return(i):
print('called: %s', i)
path = os.path.join('/tmp', str(i))
os.mkdir(path)
# clone some arbitrary repo
Repo.clone_from('https://github.com/ros/rosdistro', path)
shutil.rmtree(path)
return i
if __name__ == "__main__":
tasks = 20
workers = 4
with futures.ThreadPoolExecutor(max_workers=workers) as executor:
# this works as expected... delaying work until a thread is available
# fs = [executor.submit(wait_then_return, i) for i in range(0, tasks)]
# this doesn't... all 20 come in quick succession
fs = [executor.submit(clone_then_return, i) for i in range(0, tasks)]
for future in futures.as_completed(fs):
print('result: %s', future.result())
当我将 wait_then_return
函数提交给执行程序时,我得到了预期的行为:打印首先以四人为一组完成,然后大致沿着这些路线完成,直到所有期货都完成。如果我将其切换为 clone_then_return
那么它看起来好像 执行者忽略了 max_workers 参数并并行运行所有二十个期货。
这可能是什么原因?
实际上,我使用的 git 调用存在一些身份验证问题,导致 future 快速完成。在并发的世界里,一切仍然理智。