Comment obtenir une vitesse plus rapide lors de l'utilisation de multi-threading en python

Maintenant, je suis en train d'étudier comment extraire les données de site aussi vite que possible. Pour obtenir une vitesse plus rapide, im vu de l'utilisation de multi-thread. Voici le code que j'ai utilisé pour tester la différence entre le multi-thread et simple post.

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

comme vous pouvez le voir, c'est un code très simple. j'ai d'abord définir le mode "Simple", et je peux obtenir l'intervalle de temps: années 50(peut-être que ma vitesse est un peu lent :(). puis j'ai mis le mode "Multiple", et je obtenir l'intervalle de temps: 35. à partir de ce que je peux voir, multi-thread peut en fait augmenter la vitesse, mais le résultat n'est pas aussi bon que je l'imagine. je veux obtenir une vitesse beaucoup plus rapide.

de débogage, j'ai trouvé que le programme principalement des blocs à la ligne: open_url = urllib2.urlopen(req, self.data), cette ligne de code prend beaucoup de temps pour poster et recevoir les données provenant de ce site web. je suppose que je peux peut-être obtenir une vitesse plus rapide par ajout de time.sleep() et de l'utilisation de multi-threading à l'intérieur de la urlopen fonction, mais je ne peux pas le faire parce que ses le python, la fonction.

si ne pas considérer le prossible limites que le serveur bloque le post de vitesse, que puis-je faire pour obtenir la plus grande vitesse? ou tout autre code, je peux modifier? merci beaucoup!

  • threading est une mauvaise idée en python, il devient un goulot d'étranglement facilement et peut se faire piéger par le GIL, essayez de multitraitement.
  • les threads sont un détail de l'implémentation ici, l'accent est d'avoir de multiples connexions ouvertes. Le GIL aspect de threads en Python n'a pas de rôle ici que ce soit.
  • vous devriez vraiment lire sur GIL et le filetage avant de faire des déclarations comme ça... commencez ici: PyCon 2010: la Compréhension de l'Python GIL
InformationsquelleAutor Searene | 2012-04-14