python 安装模块 python的queue模块会不会被锁死

来源:互联网  时间:2016/7/15 0:29:36

关于网友提出的“python 安装模块 python的queue模块会不会被锁死”问题疑问,本网通过在网上对“python 安装模块 python的queue模块会不会被锁死”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:python 安装模块 python的queue模块会不会被锁死
描述:

我把抓取的数据通过rpc发送给调度里面的queue,调度里面的有几个线程消费该queue,
刚开始还可以,几个小时后就卡死了,发送给rpc的进程也卡住了,不抓数据了,而queue是满的,却不消费

rpc.py
import rpyc
from scheduler import Scheduler
import time
import queue

scheduler = Scheduler()

class Service(rpyc.Service):
    def exposed_add_task(self, task):
        try:
            scheduler.add_task(task)
        except queue.Full:
            time.sleep(1)

if __name__ == '__main__':
    import threading
    import rpyc.utils.server

    print('scheduler startup')
    scheduler.run()

    print('rpc server startup')
    server = rpyc.utils.server.ThreadedServer(Service, port=50000)
    thread = threading.Thread(target=server.start)
    thread.start()
    try:
        thread.join()
    except KeyboardInterrupt:
        scheduler.stop()
    server.close()
    print('rpc server shutdown')
scheduler.py
class Scheduler:
    def __init__(self, worker_num=8):
        self.worker_num = worker_num
        self.task_queue = queue.Queue(500)
        self._stop = False

    def _work(self):
        while not self._stop:
            try:
                print('queue size', self.task_queue.qsize())
                typ, *data = self.task_queue.get()
            except queue.Empty:
                time.sleep(1)
                continue
            except:
                pass

            self.task_queue.task_done()

    def _init_workers(self):
        for _ in range(self.worker_num):
            t = threading.Thread(target=self._work)
            t.deamon = True
            t.start()

    def add_task(self, task):
        self.task_queue.put(task)

    def run(self):
        self._init_workers()

    def stop(self):
        self._stop = True

解决方案1:

理论上QUEUE不可能死锁,因为你读写的时候自动加Q锁,在占有Q锁的期间不可能再申请其它锁
从这方面来讲,QUEUE对使用者来说是原子的

如果真的存在死锁,那必然是其它锁交叉占用死的,与Q锁无关

要看为何阻塞,先看看阻塞在哪里

建议

上一篇(python)下面两个url有什么区别
下一篇(python)Flask如何获取客户端提交过来的数据
明星图片
相关文章
《python 安装模块 python的queue模块会不会被锁死》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)