python - Python 中的时间密集型集合处理

标签 python python-3.x concurrency parallel-processing

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

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

我有一个从网站抓取中获得的字符串集合。 (字符串将定期从站点抓取中检索。)这些字符串中的每一个都需要通过网络针对第三方进行验证。验证过程有时可能很慢,这是有问题的。由于上述代码的迭代性质,可能需要一些时间才能验证和处理最后一个字符串。

有没有合适的方法在 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_WORKERS) 个 is_valid() 调用。 as_completed() 在其结果准备好检索时立即返回一个 future 对象,并且 executor 自动将计算结果的线程交给 is_valid( ) 来咀嚼。

关于python - Python 中的时间密集型集合处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860892/

相关文章:

Python MD5 破解程序 "TypeError: object supporting the buffer API required"

python-3.x - 如何捕获动态调用的函数中引发的异常?

java - ConcurrentHashMap中的遍历

c++ - 互斥锁是如何真正工作的?

c++ - 如何以原子方式更新最大值?

python - Python 法语词典

python - 在Python循环中计算余额和每月付款

python - 计算字符串中的特定字符 - Python

python - 正则表达式:如何使用正则表达式在可选捕获组之后捕获组?

Python - 两个字符串之间的区别