저는 우리 저장소를 거쳐가는 "크롤러"작업을하고 디렉토리와 파일을 나열하면서 나열했습니다. 그것이 수행하는 모든 디렉토리에 대해, 그 디렉토리에 대해 동일한 작업을 수행하는 스레드를 재귀 적으로 작성합니다. 효과적으로 이것은 repos에서 만난 모든 디렉토리에 대해 매우 짧은 스레드를 생성합니다. 물론이 작업이 완료 코드가 아닙니다P4Python : 동시에 PERFORCE 정보를 요청하는 다중 스레드를 사용하십시오.
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()
을하지만, 다음과 같이 논리 보이는
(그것은 그 수천의 단지 수십가 단지 하나 개의 경로에 대한 정보를 요청하는 것은 매우 오래 걸리지 않습니다) 그것은 내가하는 일을 나타냅니다.
제 질문은 실제로 크롤러 클래스의 __init__
메서드에서이 PERFORCE 클래스의 인스턴스를 만들 수 있는지 여부입니다. 따라서 요청을 개별적으로 수행 할 수 있습니다. 지금 당장은 생성 된 쓰레드에 join()
이라고 불러야 만 동시 대기를 피할 수 있습니다.
시도해 보았지만 만들 수있는 연결 수에 제한이있는 것처럼 보입니다. 단색 번호가 없지만 어딘가에있는 Perforce가 곧바로 연결 거부를 시작했습니다. 나는 동시 요청의 수 때문에 생각합니다.
정말 내가 바라는 것은 두 가지입니다. 사용중인 파일보다 수만 개의 파일이있는 repos를 나타내는 데이터 모델을 만드는 더 좋은 방법은 무엇입니까? 가능하다면, 그렇게한다면, 어떻게.
어떤 도움을 주시면 감사하겠습니다 :) 나는 (이 모든 단순 솔루션 지나치게 복잡한 문제로, infuriatingly 한 간단)이 작업을 수행하는 방법을 발견
'Perforce가 연결을 거부하기 직전에 바로 연결을 시작했습니다. 동시 요청의 수 때문인 것으로 추측'할 수 있습니까? 정확한 오류가 발생 했습니까? PERFORCE 서버 로그에도 메시지가 있었습니까? –
불행히도 오류를 줄 수는 없지만 연결 시간 초과와 관련이 있습니다. 퍼펙스 커넥션 비트를 가능한 한 단명하게 만들어서 필요한만큼 데이터를 제공하자마자 곧바로 종료했습니다. 필자는 PERFORCE 서버 로그에 아무런 메시지도 없다고 말할 수있는 한, 다른 방법을 필요로하는 방법을 찾지 못했습니다. 아래 답변을 참조하십시오. – MaVCArt