在实时场景中使用concurrent.futures和新的任务
在实时场景中使用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
列表是固定的。是否可以实时提供这个列表并让工作线程按照它们的到来进行处理,可能是通过一个队列进行管理?我有点困惑,不确定我的方法是否可行?