2012-04-13 11 views
2

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

abgeschlossen

2) 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() 
+0

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. –

+0

möglich duplicate von [Are urllib2 und httplib thread sicher?] (Http://stackoverflow.com/questions/5825151/are-urllib2-and-httplib-thread-safe) –

+0

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

Antwort

0

Mit Requests könnten Sie so etwas tun:

from requests import session, async 

auth = ('username', 'password') 
url = 'http://example.com/api/' 
options = ['foo1', 'foo2', 'foo3'] 

s = session(auth=auth) 

rs = [async.get(url, params={'option': opt}, session=s) for opt in options] 

responses = async.imap(rs) 

for r in responses: 
    print r.text 

Relevante Dokumentation:
Sessions
Asynchronous requests
Basic authentication

+0

Ich hatte Requests vor einiger Zeit gesehen, als ich diesen Code schrieb (bevor ich ihn zum Threading erneut besuchte) und ich bin gerade erst wieder darüber gestolpert. Ich werde es versuchen, um zu sehen, ob Threading mit ihm funktioniert .... obwohl die Tatsache, dass es eine eingebaute Async-Funktionalität hat, auch wirklich nett ist. Danke für die Post. – ntlarson

+0

Kein Problem. Ich habe es einfach umgeschaltet, um 'async.imap' anstelle von' async.map' zu verwenden. Auf diese Weise erhalten Sie einen Generator, der Ihnen die Anfragen bei deren Abschluss gibt, anstatt zu blockieren, bis alle Anfragen abgeschlossen sind. – Acorn

Verwandte Themen