0

我一直在研究一种“爬虫”,它会遍历我们的存储库,并在运行时列出目录和文件。对于它所发现的每个目录,它都会创建一个线程,该线程对该目录执行相同的操作,依此类推,递归。实际上,这会为 repos 中遇到的每个目录创建一个非常短暂的线程。(只请求一条路径的信息不需要很长时间,只有几万条)

逻辑如下:

import threading
import perforce as Perforce #custom perforce class
from pathlib import Path

p4 = Perforce()
p4.connect()

class Dir():
    def __init__(self, path):
        self.dirs = []
        self.files = []
        self.path = path

        self.crawlers = []

    def build_crawler(self):
        worker = Crawler(self)
        # append to class variable to keep it from being deleted
        self.crawlers.append(worker)
        worker.start()

class Crawler(threading.Thread):
    def __init__(self, dir):
        threading.Thread.__init__(self)
        self.dir = dir

    def run(self):
        depotdirs = p4.getdepotdirs(self.dir.path)
        depotfiles = p4.getdepotfiles(self.dir.path)

        for p in depotdirs:
            if Path(p).is_dir():
                _d = Dir(self.dir, p)
                self.dir.dirs.append(_d)

        for p in depotfiles:
            if Path(p).is_file():
                f = File(p) # File is like Dir, but with less stuff, just a path.
                self.dir.files.append(f)

        for dir in self.dir.dirs:
            dir.build_crawler()
            for worker in d.crawlers:
                worker.join()

显然这不是完整的代码,但它代表了我正在做的事情。

我的问题真的是我是否可以在 Crawler 类的方法中创建这个 Perforce 类的实例__init__,以便可以单独完成请求。现在,我必须调用join()创建的线程,以便它们等待完成,以避免并发 perforce 调用。

我已经尝试过了,但是您可以创建的连接数似乎是有限制的:我没有一个可靠的数字,但是 Perforce 刚刚开始直接拒绝连接,我认为这是由于并发请求的数量。

真的我想问的是两方面的:有没有比我正在使用的更好的方法来创建一个表示包含数万个文件的存储库的数据模型,这就是我正在尝试做的可能,如果是,如何。

任何帮助将不胜感激 :)

4

1 回答 1

2

我发现了如何做到这一点(它非常简单,就像所有解决过于复杂问题的简单解决方案一样):

要构建一个数据模型,其中包含表示包含数千个文件的整个软件仓库DirFile类,只需调用p4.run("files", "-e", path + "\\..."). path这将递归地返回每个文件的列表。从那里您需要做的就是遍历每个返回的路径并从那里构建您的数据模型。

希望这在某些时候对某人有所帮助。

于 2016-09-09T14:26:51.590 回答