Теперь я изучаю, как быстро получать данные с сайта. Чтобы получить более высокую скорость, я рассматриваю возможность использования многопоточных потоков. Вот код, который я использовал для проверки разницы между многопоточной и простой почтой.Как получить более высокую скорость при использовании многопоточности в 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
как вы можете видеть, это очень простой код. сначала я устанавливаю режим на «Простой», и я могу получить временной интервал: 50s (возможно, моя скорость немного медленная :(), тогда я устанавливаю режим «Множественный», и я получаю временной интервал: . от я могу видеть, многопоточные может увеличить скорость, но результат разве так хорошо, как я себе представить. я хочу, чтобы получить гораздо более высокую скорость.
от отладки, я обнаружил, что программа в основном блоки на линии: open_url = urllib2.urlopen(req, self.data)
, эта строка кода занимает много времени, чтобы отправлять и получать данные с указанного веб-сайта. Возможно, я могу получить более быструю скорость, добавив time.sleep()
и используя многопоточность внутри функции urlopen
, но Я не могу этого сделать, потому что его собственная функция python.
Если не учитывать допустимые пределы, которые сервер блокирует скорость сообщения, что еще я могу сделать, чтобы получить более быструю скорость? или любой другой код, который я могу изменить? большое спасибо!
потоковое это плохая идея в питоне, он получает легко упирается и может попасть в ловушку в GIL, попробуйте мультипроцессирование. –
@JakobBowyer: потоки представляют собой деталь реализации, реальный фокус - открывать несколько соединений. Аспект GIL для потоковой передачи в Python не имеет здесь никакой роли. – orlp
@ nightcracker, вы действительно должны прочитать GIL и threading перед тем, как сделать такие заявления ... начать здесь: [PyCon 2010: понимание Python GIL] (http://python.mirocommunity.org/video/1479/pycon- 2010-understanding-the-p) –