Python的时密集型收集处理



代码已被大大简化,但应该用来说明我的问题。

S = ('A1RT', 'BDF7', 'CP09')
for s in S:
    if is_valid(s): # very slow!
        process(s)

i有一系列从站点缝隙中获得的字符串。(将定期从站点隔离中检索字符串。)这些字符串中的每个字符串都需要通过网络与第三方进行验证。验证过程有时可能很慢,这是有问题的。由于上述代码的迭代性质,可能需要一段时间才能验证最后一个字符串。

是否有适当的方法可以在Python中平行上述逻辑?坦率地说,我对并发/并行处理的概念并不熟悉,但是在这种情况下它们似乎很有用。想法?

concurrent.futures模块是开始处理"令人尴尬的并行"问题的好方法,并且很容易在单个过程中使用多个过程或多个线程之间切换。

在您的情况下,听起来像是在网络上的其他机器上完成的"努力工作",而您的主要程序将花费大部分时间等待它们提供结果。如果是这样,线程应该正常工作。这是一个完整的可执行玩具示例:

import concurrent.futures as cf
def is_valid(s):
    import random
    import time
    time.sleep(random.random() * 10)
    return random.choice([False, True])
NUM_WORKERS = 10  # number of threads you want to run
strings = list("abcdefghijklmnopqrstuvwxyz")
with cf.ThreadPoolExecutor(max_workers=NUM_WORKERS) as executor:
    # map a future object to the string passed to is_valid
    futures = {executor.submit(is_valid, s): s for s in strings}
    # `as_complete()` returns results in the order threads
    # complete work, _not_ necessarily in the order the work
    # was passed out
    for future in cf.as_completed(futures):
        result = future.result()
        print(futures[future], result)

这是一项运行的样本输出:

g False
i True
j True
b True
f True
e True
k False
h True
c True
l False
m False
a False
s False
v True
q True
p True
d True
n False
t False
z True
o True
y False
r False
w False
u True
x False

concurrent.futures处理启动线程的所有头痛,为他们完成工作,并注意到线程何时提供结果。

如上所述,直至10( NUM_WORKERSis_valid()调用可以同时处于活动状态。as_completed()在结果准备检索后立即返回未来对象,并且executor自动将其计算为is_valid()咀嚼的另一个字符串的线程。

最新更新