在实时场景中使用concurrent.futures和新的任务

12 浏览
0 Comments

在实时场景中使用concurrent.futures和新的任务

使用Python 3的concurrent.futures模块可以很容易地进行并行工作,如下所示。

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    future_to = {executor.submit(do_work, input, 60): input for input in dictionary}
    for future in concurrent.futures.as_completed(future_to):
        data = future.result()  

同时,将项目插入和从队列中检索出来非常方便。

q = queue.Queue()
for task in tasks:
q.put(task)
while not q.empty():
   q.get()

我有一个在后台运行的脚本,用于监听更新。现在,理论上假设,当这些更新到达时,我会将它们排队,并使用ThreadPoolExecutor并行处理它们。

现在,就个别组件而言,它们都可以独立地工作,并且是有意义的,但是如何将它们一起使用呢?我不知道是否可能实时地从队列中提供工作给ThreadPoolExecutor,除非工作的数据是预先确定的?

简而言之,我只想做的是,每秒接收4条消息的更新,将它们放入一个队列中,并让我的concurrent.futures处理它们。如果不这样做,我将被困在一个顺序的方法中,速度很慢。

让我们看看Python文档中的经典示例

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))

URLS列表是固定的。是否可以实时提供这个列表并让工作线程按照它们的到来进行处理,可能是通过一个队列进行管理?我有点困惑,不确定我的方法是否可行?

0