python访问redis的list队列出现大量进程TIME_WAIT状态,求大神解决!!!

principl 2016-04-24 10:57:10
问题背景:在redis中有一个list类型的对象,key——sha_list,里面python进程A负责向sha_list里面push内容,10个进程B从里面pop内容。如果B进程在pop时发现内容sha_list没有内容了,进程B就结束了。

出现的现象是:sha_list已经没有内容了,但是有一部分(不是全部)的进程B没有结束,查看进程网络状态,发现是TIME_WAIT状态。这些进程一直没有被结束。

为什么呢?为什么会有一部分进程处于TIME_WAIT状态呢?为什么客户段进程B被redis断开连接之后,会处于这个状态呢?什么原因导致的呢?


进程A代码:
def GetShaList(start_time, end_time, date):
pool = redis.ConnectionPool(host=HOST_IP, port=PORT, db=SHA_DB)
conn_obj = redis.StrictRedis(connection_pool=pool)
full_item = "%s|%s"%(start_time, end_time)
conn_obj.lpush("sha_list", full_item)


进程B代码:
def GetShaFromRedis():
pool = redis.ConnectionPool(host=HOST_IP, port=PORT, db=SHA_DB)
conn_obj = redis.StrictRedis(connection_pool=pool)
if conn_obj.llen("sha_list") <= 0:
return None, None

full_item = conn_obj.lpop("sha_list").split('|')
sha_str_key = full_item[0]
sha_date = full_item[1]

return sha_str_key, sha_date

if __name__ == "__main__":
sha_str_key, sha_date = GetShaFromRedis()

有大神遇到过这个问题吗?这个问题的根源到底在什么地方呢?
...全文
922 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyzzxf2010 2019-06-26
  • 打赏
  • 举报
回复
估计是在多线程的时候 if conn_obj.llen("sha_list") <= 0: return None, None 这一步判断的时候队列还是非空的,然后继续向下执行的时候,队列中的元素被另外的进程取空了,然后这个进程 的pop就被阻塞了
principl 2016-04-26
  • 打赏
  • 举报
回复
说错了,是CLOSE_WAIT状态。难道这个又要绝贴了吗?大神在哪里啊!

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧