0

我想知道这是否曾经出现过?

我有一个从我们的 GitHub Enterprise 实例下载大量信息的应用程序(目前不使用 github3.py,但我正在考虑将其转换为使用 github3.py)。基本上,它会抓取 189 个 repos,然后对于每个 repo,它会拉取分支、标签和提交。这显然很慢,因为它必须串行执行很多 HTTP 请求。

我想知道是否可以让 github3.py 返回grequest对象,以便我可以让 grequests 并行执行请求?或者,另一种选择是通过在 github3.py 中设置“并发级别”并让它处理并行请求来包装和隐藏 grequest。或者也许是一个上下文管理器:

with github3.parallel():
    tags = pull_tags(git_repo)
    branches = pull_branches(git_repo)

我认识到,想出一个可以很好地与并行化配合使用的 API 可能是相当具有挑战性的,因为它是一个完全不同的范式。这就是为什么我不想用这个来混淆问题跟踪器。

4

1 回答 1

1

这将异常困难。grequests和其他围绕请求的包装器不提供 Session API(因为请求的 Session 没有应有的线程安全——即,它们不是)。如果他们提供了这样做的方法,那可能会奏效。最好的方法是创建多个GitHub实例,在每个 worker greenlet/thread 中创建一个,并在每个线程的上下文中使用它们。通过这样做,您将拥有每个 greenlet 的 Session 并且您的操作应该是安全的(只要您不在线程之间传递您的对象)。

于 2014-11-02T04:09:38.463 回答