Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取消息时阻止redis py订阅_Python_Redis - Fatal编程技术网

Python 读取消息时阻止redis py订阅

Python 读取消息时阻止redis py订阅,python,redis,Python,Redis,最近,我使用python和redis构建了一个smarl messge驱动的项目。 我使用一个线程订阅redis频道(这里称为消息线程);定时器线程;和一根工作线; 当消息线程获得足够的消息时,它会将任务发布给工作线程。 我使用redis py与redis进行通信 消息线程: 订阅redis while True: get message; if len(messages)>threashold: post task to Worker 工作线程: while True:

最近,我使用python和redis构建了一个smarl messge驱动的项目。 我使用一个线程订阅redis频道(这里称为消息线程);定时器线程;和一根工作线; 当消息线程获得足够的消息时,它会将任务发布给工作线程。 我使用redis py与redis进行通信

消息线程:

订阅redis

while True:

   get message;

   if len(messages)>threashold: post task to Worker
工作线程:

while True:

   wait task event;

   do task; //this may be heavy
问题来了: 经过一段时间的工作后,redis py子包被阻塞了!(OfcourceRedis仍然是发布消息,但它不再返回,只是被阻止了!)。我使用gdb连接到它,我看到堆栈框架如下:

[切换到线程4(线程1084229984(LWP 9812))]#0 0x000000302b80b0cf,从/lib64/tls/libpthread.so.0中读取并取消() (gdb)英国电信 0 0x000000302b80b0cf,位于/lib64/tls/libpthread.so.0中的

posix_读取中的1 0x00000000004e129a(self=变量“self”不可用。)位于./Modules/posixmodule.c:6592

PyEval_EvalFrameEx中的2 0x00000000004a04c5(f=0x157a8c0,throwflag=变量“throwflag”不可用)位于Python/ceval.c:4323

我甚至使用redis‘client kill’命令来终止python和redis之间的连接,但是python仍然在那里阻塞,从不返回或引发exeption。唯一的方法是使用kill-9终止python进程

然后我评论了work的“DoTask”过程(记住这个任务很重,它需要大量的网络io和cpu计算),它运行良好,没有发现任何问题

所以,似乎得出了这样的结论:一旦我使用worker-do任务,消息线程将在套接字读取时阻塞


这怎么会发生

最可能的解释是您在任务处理代码中使用了相同的Redis连接。你不应该

一旦连接已订阅,则除了接收消息或运行其他SUBSCRIBE、PSUSCRIBE、UNSUBSCRIBE和PUNSCRIBE命令外,您不能将其用于任何其他用途


您的任务处理代码中可能需要第二个Redis连接。

谢谢您的回复,但原因是没有重用Redis连接。我发现python版本是2.3.x,当我更新到2.7时,问题消失了。。。以下是我的发现: . 出现这个问题是因为程序中的“任务”可能会创建线程来执行某些操作。