2016-09-09 2 views
0

저는 우리 저장소를 거쳐가는 "크롤러"작업을하고 디렉토리와 파일을 나열하면서 나열했습니다. 그것이 수행하는 모든 디렉토리에 대해, 그 디렉토리에 대해 동일한 작업을 수행하는 스레드를 재귀 적으로 작성합니다. 효과적으로 이것은 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 한 간단)이 작업을 수행하는 방법을 발견

+0

'Perforce가 연결을 거부하기 직전에 바로 연결을 시작했습니다. 동시 요청의 수 때문인 것으로 추측'할 수 있습니까? 정확한 오류가 발생 했습니까? PERFORCE 서버 로그에도 메시지가 있었습니까? –

+0

불행히도 오류를 줄 수는 없지만 연결 시간 초과와 관련이 있습니다. 퍼펙스 커넥션 비트를 가능한 한 단명하게 만들어서 필요한만큼 데이터를 제공하자마자 곧바로 종료했습니다. 필자는 PERFORCE 서버 로그에 아무런 메시지도 없다고 말할 수있는 한, 다른 방법을 필요로하는 방법을 찾지 못했습니다. 아래 답변을 참조하십시오. – MaVCArt

답변

2

:

에 포함 된 데이터 모델을 구축하려면 DirFile 수천 개의 파일이있는 전체 저장소를 나타내는 클래스는 p4.run("files", "-e", path + "\\...")으로 전화하면됩니다. 이것은 모든 파일 목록을 path에 반복적으로 반환합니다. 여기에서 반환 된 모든 경로를 반복하고 거기에서 데이터 모델을 구성하면됩니다.

누군가가 도움이되기를 바랍니다.

관련 문제