2016-07-29 65 views
0

在python中,我有一個線程向數組添加元素。而我有另一個線程使用該數組的第一個元素,然後刪除它。 問題是第二個線程比第一個線程更快,所以我需要它等待第一個線程添加其他元素,然後處理而不是進入錯誤索引超出範圍。使用動態數組python多線程

什麼是最快的方法?

回答

3

你應該使用Synchronised Queue職業或類似的。

Queue類通過阻塞和可選的超時處理超長和低長。這也是線程安全的。

import threading 
import Queue 
import time 
import logging 

logging.basicConfig(level=logging.DEBUG,format='%(threadName)s: %(message)s') 

q = Queue.Queue(10) 

class Producer(threading.Thread): 
    def __init__(self,group=None,target=None,name=None,args=None,kwargs=None): 
    if args is None: 
     args =() 
    if kwargs is None: 
     kwargs = {} 
    super(Producer,self).__init__(group=group,target=target,name=name,args=args,kwargs=kwargs) 
    self.max_count = 10 
    self.delay = 3 
    def run(self): 
    count = 0 
    logging.debug('Starting run') 
    while count <= self.max_count: 
     q.put(count) 
     logging.debug('Putting idx {0} in queue, queue length = {1}'.format(count,q.qsize())) 
     count += 1 
     time.sleep(self.delay) 
    logging.debug('Finished run') 

class Consumer(threading.Thread): 
    def __init__(self,group=None,target=None,name=None,args=None,kwargs=None): 
    if args is None: 
     args =() 
    if kwargs is None: 
     kwargs = {} 
    super(Consumer,self).__init__(group=group,target=target,name=name,args=args,kwargs=kwargs) 
    self.timeout = 10 
    self.delay = 1 
    def run(self): 
    logging.debug('Starting run') 
    while True: 
     try: 
     work = q.get(True,self.timeout) 
     except Queue.Empty: 
     logging.debug('Queue still empty after {0} giving up'.format(self.timeout)) 
     break 
     logging.debug('Received idx {0} from queue, queue length = {1}'.format(work,q.qsize())) 
     time.sleep(self.delay) 
    logging.debug('Finished run') 

def main(): 
    p = Producer(name='producer') 
    c = Consumer(name='consumer') 
    p.daemon = True 
    c.daemon = True 
    p.start() 
    time.sleep(8) 
    c.start() 

當運行:

>>> main() 
producer: Starting run 
producer: Putting idx 0 in queue, queue length = 1 
producer: Putting idx 1 in queue, queue length = 2 
producer: Putting idx 2 in queue, queue length = 3 
consumer: Starting run 
consumer: Received idx 0 from queue, queue length = 2 
producer: Putting idx 3 in queue, queue length = 3 
consumer: Received idx 1 from queue, queue length = 2 
consumer: Received idx 2 from queue, queue length = 1 
consumer: Received idx 3 from queue, queue length = 0 
producer: Putting idx 4 in queue, queue length = 1 
consumer: Received idx 4 from queue, queue length = 0 
producer: Putting idx 5 in queue, queue length = 1 
consumer: Received idx 5 from queue, queue length = 0 
producer: Putting idx 6 in queue, queue length = 1 
consumer: Received idx 6 from queue, queue length = 0 
producer: Putting idx 7 in queue, queue length = 1 
consumer: Received idx 7 from queue, queue length = 0 
producer: Putting idx 8 in queue, queue length = 1 
consumer: Received idx 8 from queue, queue length = 0 
producer: Putting idx 9 in queue, queue length = 1 
consumer: Received idx 9 from queue, queue length = 0 
producer: Putting idx 10 in queue, queue length = 1 
consumer: Received idx 10 from queue, queue length = 0 
producer: Finished run 
consumer: Queue still empty after 10 giving up 
consumer: Finished run 
+1

一個例子會有所幫助。 –

+0

@JulienFadel:這個例子有用嗎? – MattH

+0

我只是在我的應用程序中使用以下語法:import queue - > queue = queue.Queue() - > queue.put('a') - > queue.get()這就是所有,它做了我想要的快速。 –