[英]python threading and queues for infinite data input (stream)
我想使用線程來處理流輸入。
如何通過使用itertools.count為無限輸入生成以下代碼
下面的代碼將起作用:'for i in itertools.count():'替換為'for i in xrange(5):'
from threading import Thread
from Queue import Queue, Empty
import itertools
def do_work(q):
while True:
try:
x = q.get(block=False)
print (x)
except Empty:
break
if __name__ == "__main__":
work_queue = Queue()
for i in itertools.count():
work_queue.put(i)
threads = [Thread(target=do_work, args=(work_queue,)) for i in range(8)]
for t in threads: t.start()
for t in threads: t.join()
問題是itertools.count
生成一個無限序列。 這意味着for循環永遠不會結束。 你應該把它放在它自己的函數中並使它成為一個單獨的線程。 這樣,當工作線程從隊列中獲取數據時,您將使隊列增長。
也許我錯過了一些東西,但是它不像在for
循環之前創建和啟動線程那么簡單嗎?
此外,當沒有工作時讓你的線程終止似乎是一個壞主意,因為將來可能會有更多的工作出現。 當然,你希望他們阻止,直到有一些工作可用?
您需要使用線程填充隊列。 您需要管理隊列大小。 特別是如果工人花時間處理物品。 您需要標記完成的隊列項。 如果這與您關於twitter和“極快”輸入的其他問題有關,那么您在數據庫插入方面還有很多工作要做。
你的問題在相當復雜的主題上過於含糊。 你似乎並不了解甚至你想要達到的目標,知道這並不容易。 我建議您更加具體地了解自己要做的事情。
以下是使用線程填充和使用隊列的示例。 隊列大小未被管理。
from threading import Thread
from Queue import Queue, Empty, Full
import itertools
from time import sleep
def do_work(q,wkr):
while True:
try:
x = q.get(block=True,timeout=10)
q.task_done()
print "Wkr %s: Consuming %s" % (wkr,x)
sleep(0.01)
except Empty:
print "Wkr %s exiting, timeout/empty" % (wkr)
break
sleep(0.01)
def fill_queue(q,limit=1000):
count = itertools.count()
while True:
n = count.next()
try:
q.put(n,block=True,timeout=10)
except Full:
print "Filler exiting, timeout/full"
break
if n >= limit:
print "Filler exiting, reached limit - %s" % limit
break
sleep(0.01)
work_queue = Queue()
threads = [Thread(target=do_work, args=(work_queue,i)) for i in range(2)]
threads.insert(0,Thread(target=fill_queue,args=(work_queue,100)))
for t in threads:
t.start()
for t in threads:
t.join()
Wkr 0: Consuming 0
Wkr 1: Consuming 1
Wkr 0: Consuming 2
Wkr 1: Consuming 3
....
Wkr 1: Consuming 99
Filler exiting, reached limit - 100
Wkr 0: Consuming 100
Wkr 1 exiting, timeout/empty
Wkr 0 exiting, timeout/empty
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.