我正在尝试为我的手机编写一个简单的 Python 脚本,以使用 urrlib2 定期加载网页。实际上我并不真正关心服务器响应,我只想将 URL 中的一些值传递给 PHP。问题是 Python for S60 使用旧的 2.5.4 Python 内核,这似乎在 urrlib2 模块中存在内存泄漏。正如我所读到的,在每种类型的网络通信中似乎也存在这样的问题。此处已报告此错误几年前,同时也发布了一些解决方法。在 Google 的帮助下,我已经尝试了在该页面上可以找到的所有内容,但在加载大约 70 个页面后,我的手机仍然内存不足。奇怪的是,垃圾收集器似乎也没有任何区别,除了让我的脚本慢得多。据说,较新的(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,软件导致连接中止
为什么我不能发送多条消息??