簡體   English   中英

用於無限數據輸入的python線程和隊列(流)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM