Ahora estoy estudiando cómo recuperar datos del sitio web lo más rápido posible. Para obtener una velocidad más rápida, estoy considerando usar múltiples hilos. Aquí está el código que utilicé para probar la diferencia entre la publicación de subprocesos múltiples y simple.Cómo obtener una velocidad más rápida al usar multi-threading en 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
tal como puede ver, este es un código muy simple. primero establezco el modo en "Simple", y puedo obtener el intervalo de tiempo: 50s (tal vez mi velocidad es un poco lenta :(). Luego configuro el modo a "Múltiple", y obtengo el intervalo de tiempo: . de eso puedo ver, multi-hilo puede aumentar la velocidad, pero el resultado no es tan bueno como me imagino. Quiero obtener una velocidad mucho más rápida
de depuración, encontré que el programa principalmente bloques en la línea: open_url = urllib2.urlopen(req, self.data)
, esta línea de código toma mucho tiempo para publicar y recibir datos del sitio web especificado. Supongo que tal vez pueda obtener una velocidad más rápida agregando time.sleep()
y usando multi-threading dentro de la función urlopen
, pero No puedo hacer eso porque es la función de la pitón.
si no se consideran los límites posibles de que el servidor bloquee la velocidad de publicación, ¿qué más puedo hacer para obtener la velocidad más rápida? o cualquier otro código que pueda modificar? ¡muchas gracias!
enhebrado es una mala idea en Python, el fichero es un cuello de botella con facilidad y puede quedar atrapado por el GIL, trate de multiprocesamiento. –
@JakobBowyer: los hilos son un detalle de implementación aquí, el enfoque real es tener múltiples conexiones abiertas. El aspecto GIL de enhebrar en Python no tiene ningún papel aquí. – orlp
@nightcracker, realmente debería leer GIL y enhebrar antes de hacer declaraciones como esa ... comience aquí: [PyCon 2010: Understanding the Python GIL] (http://python.mirocommunity.org/video/1479/pycon- 2010-understanding-the-p) –