Я пытаюсь написать простой скрипт на Python для моего мобильного телефона, чтобы периодически загружать веб-страницу с помощью urrlib2. На самом деле меня не волнует ответ сервера, я бы хотел передать PHP только некоторые значения в URL. Проблема заключается в том, что Python для S60 использует старое ядро 2.5.4 Python, которое, похоже, имеет утечку памяти в модуле urrlib2. Когда я читаю, кажется, что такие проблемы есть и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, хотя некоторые обходные пути были также опубликованы. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но мой телефон все еще не хватает памяти после ~ 70 загрузки страницы. Странно, но Garbege Collector, похоже, тоже ничего не меняет, за исключением того, что мой сценарий стал намного медленнее. Говорят, что новое ядро (3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока не появится порт S60.
вот как выглядит мой скрипт после добавления каждого небольшого трюка, который я нашел:
<code>
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:
Пробовал метод сокетов, как предлагалось ранее, это второе лучшее (неправильное) решение на данный момент:
<code>
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 нет.)
UPDATE :
Я думаю, что я все ближе к решению! Я попытался отправить несколько данных без закрытия и повторного открытия сокета. Это может быть ключом, так как этот метод оставит только один дескриптор открытого файла. Проблема:
<code>
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, программное обеспечение вызвало прерывание соединения
Почему я не могу отправить несколько сообщений ??