0

У меня проблема с потоком python. Я смотрю вокруг больше дня, и это не улучшается, поэтому я подумал о помощи. Я использую python3.4. Первый вопрос, что будет разница между:Как работает python threading run для запуска своих аргументов?

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

и я использую toBeProcessed +'/robots.txt' в какой-то части в коде. Если я использовал вышеописанный метод, он не дал мне ошибок, но он все равно не работает так, как должен, не все потоки выполняются. Хотя если бы я использовал метод ниже он говорит мне, что unsupported operand type(s) for +: '_thread._local' and 'str':

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

Обратите внимание, что у меня есть это заявление toBeProcessed = threading.local().

Второй вопрос касается остальной части кода, только два потока выполняют работу, остальная часть потока - все, что было их числом, не работает.

Полный код:

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) 

не URL инициализируется как этот url = [] и это, как я запускаю темы, myThread(spider, (url,maxPages)).start

ответ

0

Вы делаете это неправильно. Вам не нужно объединить экземпляр local со строкой. Вы должны хранить атрибут на вашем local например так:

import threading 

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

Кроме того, вы должны рассмотреть возможность использования super() в методе __init__.

+0

это дает мне ошибку 'toBeProcessed.url = url.pop() AttributeError:«функция»объект не имеет атрибута«pop'' –

+0

и что бы это было иначе, чем если бы я использовать 'запуска (self.url) 'чем' run (url) '? –

+0

в 'self.url',' url' является переменной экземпляра. в то время как в 'run (url)', url является справедливым и аргументом для 'run', который называется. Каков тип 'url'? – styvane

Смежные вопросы