Ora sto studiando come recuperare i dati dal sito Web il più velocemente possibile. Per ottenere una maggiore velocità, sto considerando l'utilizzo di multi-thread. Ecco il codice che ho usato per testare la differenza tra post multi-thread e semplice.Come ottenere una maggiore velocità quando si utilizza il multi-threading in python
import threading
import time
import urllib
import urllib2
class Post:
def __init__(self, website, data, mode):
self.website = website
self.data = data
#mode is either "Simple"(Simple POST) or "Multiple"(Multi-thread POST)
self.mode = mode
def post(self):
#post data
req = urllib2.Request(self.website)
open_url = urllib2.urlopen(req, self.data)
if self.mode == "Multiple":
time.sleep(0.001)
#read HTMLData
HTMLData = open_url.read()
print "OK"
if __name__ == "__main__":
current_post = Post("http://forum.xda-developers.com/login.php", "vb_login_username=test&vb_login_password&securitytoken=guest&do=login", \
"Simple")
#save the time before post data
origin_time = time.time()
if(current_post.mode == "Multiple"):
#multithreading POST
for i in range(0, 10):
thread = threading.Thread(target = current_post.post)
thread.start()
thread.join()
#calculate the time interval
time_interval = time.time() - origin_time
print time_interval
if(current_post.mode == "Simple"):
#simple POST
for i in range(0, 10):
current_post.post()
#calculate the time interval
time_interval = time.time() - origin_time
print time_interval
proprio come si può vedere, questo è un codice molto semplice. prima ho impostato la modalità su "Semplice", e posso ottenere l'intervallo di tempo: 50s (forse la mia velocità è un po 'lenta :(). poi ho impostato la modalità su "Multiple", e ottengo l'intervallo di tempo: . da quello che posso vedere, multi-thread può effettivamente aumentare la velocità, ma l'isnt risultato buono come immagino. Voglio ottenere una velocità molto più veloce.
dal debug, ho trovato che il programma principalmente blocchi alla riga: open_url = urllib2.urlopen(req, self.data)
, questa riga di codice impiega molto tempo per pubblicare e ricevere dati dal sito Web specificato, suppongo che sia possibile ottenere una maggiore velocità aggiungendo time.sleep()
e utilizzando la funzione multi-threading all'interno della funzione urlopen
, ma non posso farlo perché è la stessa funzione del pitone
se non considerando i limiti possibili che il server blocca la velocità del post, cos'altro posso fare per ottenere una maggiore velocità? o qualsiasi altro codice che posso modificare? grazie mille!
threading è una cattiva idea in python, diventa un collo di bottiglia facilmente e possono rimanere intrappolati dalla GIL, provare multiprocessing. –
@JakobBowyer: i thread sono dettagli di implementazione qui, il vero obiettivo è avere più connessioni aperte. L'aspetto GIL del threading in Python non ha alcun ruolo qui. – orlp
@nightcracker, dovresti davvero leggere su GIL e fare il threading prima di fare affermazioni del genere ... inizia qui: [PyCon 2010: Capire il Python GIL] (http://python.mirocommunity.org/video/1479/pycon- 2010-understanding-the-p) –