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
es gibt mir einen Fehler 'toBeProcessed.url = url.pop() AttributError: 'Funktion' Objekt hat kein Attribut 'pop'' –
und was wäre es anders als wenn ich' run (self.url) verwenden 'als' run (url) '? –
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