0

Ich habe ein Python-Threading-Problem. Ich habe mich länger als einen Tag umgesehen und es wird nicht besser, also dachte ich daran, um Hilfe zu bitten. Ich benutze python3.4. Die erste Frage ist, was den Unterschied zwischen würde:Wie führt Python-Threading seine Argumente aus?

class myThread (threading.Thread): 
    def __init__(self, url): 
     threading.Thread.__init__(self) 
     self.url = url 
    def run(self): 
     spider (url) 

und ich bin mit toBeProcessed +'/robots.txt' an einem Teil in dem Code. Wenn ich die obige Methode verwende, gibt es mir keine Fehler - aber es funktioniert immer noch nicht wie es sollte, nicht alle Threads läuft. Während, wenn ich die unten stehende Methode verwenden es mir sagt, es unsupported operand type(s) for +: '_thread._local' and 'str':

def run(self): 
    spider (self.url) 

Bitte beachte, dass ich diese Erklärung zu tun haben toBeProcessed = threading.local().

Die zweite Frage betrifft den Rest des Codes, nur zwei Threads erledigen die Arbeit, der Rest des Threads - was auch immer ihre Nummer war, funktioniert nicht.

Voll Code:

def spider(url,superMaxPages): 
    print(threading.current_thread()) 
    toBeProcessed = threading.local() 
    data = threading.local() 
    parser = threading.local() 
    links = threading.local() 
    lock = threading.Lock() 
    writeLock = threading.Lock() 

    # Start from the beginning of our collection of pages to visit: 
    while 1: 
     if LinkParser.numVisited > maxPages: 
      print ('max pages reached') 
      break 

     lock.acquire() 
     try: 
      if not url: 
       time.sleep(0.01) 
       lock.release() 
       continue 
      print('to be processed ') 
      toBeProcessed = url.pop() 
     except: 
      print('threading error') 
     lock.release() 
     # In case we are not allowed to read the page. 
     rp = robotparser.RobotFileParser() 
     rp.set_url(toBeProcessed +'/robots.txt') 
     rp.read() 
     if not(rp.can_fetch("*", toBeProcessed)): 
      continue 

     LinkParser.visited.append(toBeProcessed) 

     LinkParser.numVisited += 1 

     writeLock.acquire() 
     try: 
      f.write(toBeProcessed+'\n') 
     finally: 
      writeLock.release() 

     try: 
      parser = LinkParser() 
      data, links = parser.getLinks(toBeProcessed)   
      # Add the pages that we visited to the end of our collection 
      url = url + links 
      print("One more page added from &i",threading.get_ident()) 
     except: 
      print(" **Failed!**") 

class myThread (threading.Thread): 
    def __init__(self, url, maxPages): 
     threading.Thread.__init__(self) 
     self.maxPages = maxPages 
     self.url = url 
    def run(self): 
     spider (self.url, maxPages) 

nicht url wie diese url = [] initialisiert und das ist, wie ich meine Threads laufen, myThread(spider, (url,maxPages)).start

Antwort

0

Sie tun es falsch. Sie müssen keine Instanz von local mit Zeichenfolge verketten. Sie benötigen ein Attribut auf Ihrer local weise wie folgt zu speichern:

import threading 

toBeProcessed = threading.local() 
toBeProcessed.url = url.pop()  
toBeProcessed.url += '/robots.txt' 

Auch sollten Sie super() in Ihrem __init__ Methode zu verwenden, in Betracht ziehen.

+0

es gibt mir einen Fehler 'toBeProcessed.url = url.pop() AttributError: 'Funktion' Objekt hat kein Attribut 'pop'' –

+0

und was wäre es anders als wenn ich' run (self.url) verwenden 'als' run (url) '? –

+0

in 'self.url',' url' ist eine Instanzvariable. während in 'run (url)', URL ist nur und Argument zu "run" das gesagt wird. Was ist die Art von 'URL'? – styvane

Verwandte Themen