b_m*_*b_m 8 python memory-leaks urllib2 s60 pys60
我正在尝试为我的手机编写一个简单的Python脚本,以便使用urrlib2定期加载网页.实际上我并不关心服务器响应,我只想将URL中的一些值传递给PHP.问题是Python for S60使用旧的2.5.4 Python核心,它似乎在urrlib2模块中有内存泄漏.正如我所读到的,在每种类型的网络通信中似乎都存在这样的问题.此错误已在此处报告几年前,虽然也发布了一些解决方法.我已尝试在该页面上找到的所有内容,并且在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()
任何建议,如何让它永远工作而不会得到"无法分配内存"的错误?感谢前进,欢呼,b_m
更新: 我已经设法在内存不足之前连接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个上传后线程关闭(手机剩下50MB内存,显然Python shell没有.)
更新:我想我越来越接近解决方案了!我尝试发送多个数据而不关闭并重新打开套接字.这可能是关键,因为此方法只会留下一个打开的文件描述符.问题是:
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,软件导致连接中止
为什么我不能发送多条消息?