这两天写个爬虫调度的东西,用了 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 这几个正整数,神了