Ich entwickle eine Anwendung, die eine Reihe von REST-Aufrufe verwendet, um Daten abzurufen. Ich habe die grundlegende Anwendungslogik abgeschlossen und die Struktur für den Datenabruf ist grob wie folgt.Unterstützt urllib2 das Threading auf Servern, die grundlegende Authentifizierung benötigen?
1) der Anfangsdatenanruf ist
abgeschlossen2) für jede Antwort in dem ersten Anruf ein nachfolgender Datenanruf an einen Rest Dienst durchgeführt wird, erfordert die Standardauthentifizierung.
Die Ausführung dieser Aufrufe in sequentieller Reihenfolge kann zu einer langen Wartezeit durch den Endbenutzer führen. Daher versuche ich Threading zu implementieren, um den Prozess zu beschleunigen (IO-gebunden macht dies zu einem idealen Kandidaten für Threading). Das Problem ist, dass ich Probleme mit der Authentifizierung bei den Threads mit Threads habe.
Wenn ich die Anrufe der Reihe nach durchführe, dann funktioniert alles gut, aber wenn ich es mit dem Threaded-Ansatz einstelle, erhalte ich 401 Authentifizierungsfehler oder 500 interne Serverfehler vom Server.
Ich habe mit den REST-Dienstadministratoren gesprochen und sie wissen nichts, was gleichzeitige Verbindungen vom selben Benutzer am Serverende verhindern würde, also frage ich mich, ob das ein Problem auf dem urllib2-Ende ist.
Hat jemand Erfahrung damit?
EDIT:
Während ich bin nicht in der Lage den genauen Code schreiben werde ich eine vernünftige Darstellung nach, was ich mit sehr ähnlicher Struktur tue.
import threading
class UrlThread(threading.Thread):
def __init__(self, data):
threading.Thread.__init__(self)
self.data = data
def run(self):
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, 'https://url/to/Rest_Svc/', 'uid', 'passwd')
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)
urllib2.install_opener(opener)
option = data[0]
urlToOpen = 'https://url/to/Rest_Svc/?option='+option
rawData = urllib2.urlopen(urlToOpen)
wsData = rawData.readlines()
if wsData:
print('success')
#firstCallRows is a list of lists containing the data returned
#from the initial call I mentioned earlier.
thread_list = []
for row in firstCallRows:
t = UrlThread(row)
t.setDaemon(True)
t.start()
thread_list.append(t)
for thread in thread_list:
thread.join()
Können Sie nach dem Code, den Sie verwenden? Ich habe Multiprocessing mehrmals für ähnliche Aufgaben verwendet und habe Beispielcode, aber ich möchte es nicht veröffentlichen, wenn es nicht hilfreich ist. –
möglich duplicate von [Are urllib2 und httplib thread sicher?] (Http://stackoverflow.com/questions/5825151/are-urllib2-and-httplib-thread-safe) –
Ignacio, ich hatte diesen Beitrag gesehen und dachte darüber nach a separates Thema aufgrund der Tatsache, dass das gemeinsame Beispiel für Threading in Python mit urllib2 getan wird und ich kann urllib2 fein threading, solange ich keine Authentifizierung einbeziehen. Meine Frage war/ist spezifischer für die Art des Threads von Urllib2, wenn eine Authentifizierung erforderlich ist. Wenn dies jedoch als Kopie gilt, entschuldige ich mich. – ntlarson