Chinaunix

标题: 请教一个python中Queue的问题 [打印本页]

作者: swenker    时间: 2016-07-07 16:36
标题: 请教一个python中Queue的问题
本帖最后由 swenker 于 2016-07-08 13:39 编辑

请大家帮忙看看是什么问题,谢谢

场景如下:

backend_service.py中:

job_queue = Queue.Queue(5)

def submit_job(job):
    job_queue.put(job)
    logger.info("Enqueue new Job: JobID:%d,queue size:%d" %(job.order_id,job_queue.qsize()))

def handle_photos():
    while True:
        if not job_queue.empty():
            job = job_queue.get_nowait()
            logger.info("------------got job:%d" %job.order_id)
            print "=============================================I am a task========================="
            job_queue.task_done()
        else:
            logger.info("%d the queue is empty. will sleep 1 minute:%d..." %(id(job_queue),job_queue.qsize()))
            time.sleep(20)



worker_thread = threading.Thread(target=handle_photos)
worker_thread.setDaemon(True)
worker_thread.start()


在webadmin.py中,会接受http请求,出发submit_job, 测试发现 如果是基于web环境来测试, 现成总是认为job_queue是空的,而submit_job中的qzine确实在不断的增加的。
这是怎么回事呢?

而且如果如果用下面的单元测试代码来测试,线程能正确的获取queue的状态。
class RequestSenderThread(threading.Thread):


    def __init__(self,order_id,relative_folder,group=None, target=None, name=None, args=(), kwargs=None, verbose=None):
        super(RequestSenderThread, self).__init__(group, target, name, args, kwargs, verbose)


    def run(self):
        i = 0
        while(i<3):
            pj = PhotoJob(int('11'+str(i)),'/20',1)
            submit_job(pj)
            i+=1
            time.sleep(10)

class TestBatchImageHandler(unittest.TestCase):
    def test_send_handle_order_photo(self):
        rst = RequestSenderThread(11,'/2011/12/13')
        rst.start()
        print
        print "sender started."




作者: killnbboy    时间: 2016-07-08 19:45
整个consumer和producer在不同的进程吧?
作者: swenker    时间: 2016-07-09 00:51
回复 2# killnbboy


    这个怎么来验证呢?
    我曾试着输出了job_queue的id , id(job_queue)的值在程序运行期间,producer和consumer引用的都是一样的呀。

作者: swenker    时间: 2016-07-09 00:53
回复 2# killnbboy


    而且后来我还试过无论是producer还是consumer用的job_queue都是由web层定义,作为参数传入producer和consumer,竟然也不行,真是迷惑之至。
作者: swenker    时间: 2016-07-19 09:26
这个确实是新起的线程和主线程不在一个进程引起的,我用的uwsgi和web.py感觉是uwsgi的机制导致的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2