这两天写个爬虫调度的东西,用了 redis 库:
RUN pip2.7 install redis -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com
然后我的 py 脚本在一个 while 循环里面跑,跑着跑着发现就挂住了,用 strace 和 lsof 一看发现:
python2.7 292 root 0u CHR 136,1 0t0 4 /dev/pts/1
python2.7 292 root 1u CHR 136,1 0t0 4 /dev/pts/1
python2.7 292 root 2u CHR 136,1 0t0 4 /dev/pts/1
python2.7 292 root 3u sock 0,7 0t0 3629287 can't identify protocol
python2.7 292 root 4u IPv4 3628745 0t0 TCP d602b1d9c3a8:34926->---------:6379 (ESTABLISHED)
python2.7 292 root 12r CHR 1,9 0t0 3622123 /dev/urandom
[root@d602b1d9c3a8 /]# strace -p 292
Process 292 attached
recvfrom(4,
在接收某个 redis 的 tcp 调用地方卡住了,于是跑回去看 while 循环里面对 redis 的操作不是 set 就是 get,唯一一个值得怀疑的地方是:
while True:
# blpop
now = time.time()
diff = now - self.pre
bpopTime = self.loopTime - diff
bpopTime = int(bpopTime)
if bpopTime <= 0:
break;
if bpopTime > self.loopTime:
bpopTime = self.loopTime
req_json_tuple = self.redis.blpop("ktgg_node_id_list:" + self.log.node_id, bpopTime)
没问题啊,我这个超时时间只能是 1、2、3、4、5 这几个正整数,神了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.