2011-04-01 48 views
2

如何我使用的元组设置变量传递到线程队列使用Python建立一个队列

ml =[('A', '2011-04', '2011-05'), ('b', '2011-07', '2011-04', '2011-05'), ('c', '2011-06', '2011-07', '2011-04', '2011-05')] 

以下是queing设置:

# build a queue with tuples 
queue = Queue.Queue() 
for row in ml: 
    if not row or row[0] == "#": 
     continue 
    qSplit = row.split() 
    queue.put((qSplit[0], qSplit[1], qSplit[2],qSplit[3])) 

更新在这里更多的代码:

import sys, threading, Queue 


ml = [('a', '2011-04', '2011-05'), ('b', '2011-07', '2011-04', '2011-05'), ('c', '2011-06', '2011-07', '2011-04', '2011-05')] 

class WorkerThread(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while 1: 
      try: # take a job from the queue 
       id, null, null2, null3 = self.queue.get_nowait() 

      except Queue.Empty: 
       raise SystemExit 


if __name__ == '__main__': 
    connections = 5 

    # build a queue with tuples 
    queue = Queue.Queue() 

    for row in ml: 
     if not row or row[0] == "#": 
      continue 
     queue.put(row[:3]) 

     # print queue 

    threads = [] 
    for dummy in range(connections): 
     t = WorkerThread(queue) 
     t.start() 
     threads.append(t) 

    # wait for all threads to finish 
    for thread in threads: 
     thread.join() 
    sys.stdout.write("\n") 
    sys.stdout.flush() 
+0

这是什么都与多线程呢? – 2011-04-01 17:39:40

回答

1

不知道我明白这个问题。

qSplit = row.split() 

不会工作,因为row是一个元组,而不是字符串。但似乎你所要做的就是将元组拆分成它的组件,只是把它们一起粘到一个新的元组中。这对我来说没有意义。

你也没有在你的for循环中做任何事情。

如何:

for row in ml: 
    if not row or row[0] == "#": 
     continue 
    queue.put(row) 

无需拆什么...

+0

id,null,null,null3 = self.queue.get_nowait() ValueError:需要超过3个值才能解包.....有些tup有3个参数有些有5个,只需要4个或更少..... 。 – Merlin 2011-04-01 17:30:09

1

如果你唯一的问题是,你只希望每个元组的前几个元素(我不是很确定你想要什么),那么你可以使用切片符号去除额外的元素。这也可以防止row[3]对于少于4个元素的行产生IndexError。

for row in ml: 
    if not row or row[0]== "#": 
     continue 
    queue.put(row[:4]) 
0
# build a queue with tuples 
queue = Queue.Queue() 
for row in ml: 
    if not row or row[0] == "#": 
     continue 
    for item in row[:4]: 
     q.put(item)