我一直在研究一种“爬虫”,它会遍历我们的存储库,并在运行时列出目录和文件。对于它所发现的每个目录,它都会创建一个线程,该线程对该目录执行相同的操作,依此类推,递归。实际上,这会为 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 刚刚开始直接拒绝连接,我认为这是由于并发请求的数量。
真的我想问的是两方面的:有没有比我正在使用的更好的方法来创建一个表示包含数万个文件的存储库的数据模型,这就是我正在尝试做的可能,如果是,如何。
任何帮助将不胜感激 :)