好的,我有一个调用API并等待响应的函数。我使用线程是为了在构建DataFrame期间并行化调用请求。同样的函数稍后会被多次调用,但只有一个项。因此,迭代器实际上是一个只有1个元素的列表,因此不会发生线程处理。
如果迭代器长度为1,我想使用类似asyncio的东西来允许这3行代码无论顺序如何执行(而不是彼此等待)。
最少的代码:
from tqdm.contrib.concurrent import thread_map
import pandas as pd
def func(x):
return x+1
df = pd.DataFrame()
iterator = [1, 2, 3, 4]
df["foo"] = thread_map(func, iterator, max_workers=4)
df["bar"] = thread_map(func, iterator, max_workers=4)
df["foobar"] = thread_map(func, iterator, max_workers=4)
我想做的(async语法错误):
if len(iterator) == 1:
with async:
df["foo"] = func(iterator[0])
df["bar"] = func(iterator[0])
df["foobar"] = func(iterator[0])
else:
df["foo"] = thread_map(func, iterator, max_workers=4)
df["bar"] = thread_map(func, iterator, max_workers=4)
df["foobar"] = thread_map(func, iterator, max_workers=4)
找到一个可行的解决方案
df["foo"], df["bar"], df["foobar"] = thread_map(func, iterator * 3, max_workers=3)