Я пытаюсь написать простой скрипт Python для моего мобильного телефона, чтобы периодически загружать веб-страницу с помощью urrlib2 . На самом деле меня не волнует ответ сервера, я бы хотел передать только некоторые значения в URL-адресе в PHP. Проблема в том, что Python для S60 использует старое ядро Python 2.5.4, который, похоже, имеет утечку памяти в модуле urrlib2. Насколько я читал, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.
вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Похоже, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.
вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Похоже, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.
вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все еще не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.
вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все еще не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.
вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли:
import urrlib2, httplib, gc
while(true):
url = "http://something.com/foo.php?parameter=" + value
f = urllib2.urlopen(url)
f.read(1)
f.fp._sock.recv=None # hacky avoidance
f.close()
del f
gc.collect()
Есть предложения, как заставить его работать вечно без появления ошибки «не удается выделить память»? Спасибо за аванс, ура, б_м
обновление: Мне удалось подключиться 92 раза, прежде чем закончилась память, но этого все еще недостаточно.
update2: Пробовал метод сокета, как было предложено ранее, это второе лучшее (неправильное) решение на данный момент:
class UpdateSocketThread(threading.Thread):
def run(self):
global data
while 1:
url = "/foo.php?parameter=%d"%data
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('something.com', 80))
s.send('GET '+url+' HTTP/1.0\r\n\r\n')
s.close()
sleep(1)
Я попробовал маленькие уловки, сверху тоже. Поток закрывается после ~ 50 загрузок (в телефоне осталось 50 МБ памяти, очевидно, в оболочке Python нет).
ОБНОВЛЕНИЕ : Думаю, я приближаюсь к решению! Я попытался отправить несколько данных, не закрывая и не открывая снова сокет. Это может быть ключевым моментом, поскольку этот метод оставляет только один открытый файловый дескриптор. Проблема:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(("something.com", 80))
socket.send("test") #returns 4 (sent bytes, which is cool)
socket.send("test") #4
socket.send("test") #4
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns the number of sent bytes, ok
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns 0 on the phone, error on Windows7*
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns 0 on the phone, error on Windows7*
socket.send("test") #returns 0, strange...
*: сообщение об ошибке: 10053, программа вызвала прерывание соединения
Почему я не могу отправить несколько сообщений ??