使用python构建队列

时间:2011-04-01 17:16:29

标签: python multithreading

如何使用元组设置变量以传递到线程队列

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

以下是排队设置:

# 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()

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题。

qSplit = row.split()

不起作用,因为row是元组,而不是字符串。但似乎你所要做的就是将元组分成它的组件,只是将它们组合成一个新的元组。这对我没有意义。

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

这个怎么样:

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

无需拆分任何东西......

答案 1 :(得分:1)

如果您唯一的问题是您只想要每个元组的前几个元素(我不太确定您想要什么),那么您可以使用切片表示法来删除多余的元素。这也可以防止row[3]对于少于四个元素的行产生的IndexError。

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

答案 2 :(得分: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)