python队列线程性能

时间:2017-10-31 05:52:42

标签: python

我有两个关于python中线程和队列的问题。

  1. max_sizequeue.Queue() arg做了什么?
  2. 是否有任何性能改进取决于线程数(num_worker_threads)?我找不到任何改进。
    - >如果根据线程数没有改进,我们为什么需要这个?
  3. import time 
    import queue
    import threading
    
    num_worker_threads = 10
    
    store = []
    def worker():
        while True:
            item = q.get()
            if item is None:
                break
            store.append(item)
            q.task_done()
    
    
    start = time.time()        
    q = queue.Queue() # what does max_size do in queue?
    threads = []
    for i in range(num_worker_threads):
        t = threading.Thread(target=worker)
        t.start()
        threads.append(t)
    
    for item in range(1000000):
        q.put(item)
    
    # block until all tasks are done
    q.join()
    
    # stop workers
    for i in range(num_worker_threads):
        q.put(None)
    for t in threads:
        t.join()
    end = time.time()
    
    print('running time: {}'.format(end - start))
    

1 个答案:

答案 0 :(得分:0)

您可以在队列中设置最大大小,以便为您的工作人员提供限制机制。假设您有X生产者和Y消费者使用相同的队列,如果任何消费者抛出Queue.Full异常,您可以将此作为信号来减慢生产速度。

在你的情况下,因为工作实际上没有做任何计算上昂贵的事情(只是附加到列表,我可能会添加一个不安全的方式),而你只有1个生产者和10个消费者,队列很可能永远是空的,而消费者是空闲的(如果get方法附加了超时,则会抛出Queue.Empty异常。

作为旁注,为了弄清楚哪些消费者和生产者都处于空闲状态,您应该对队列的timeoutput方法使用get参数