我正在尝试编写一个程序,该程序从文件中检索要执行的任务列表,并异步执行任务。每个任务都有以下形式:从文件中读取数据,进行一些计算(需要几分钟),然后将结果写入另一个文件。文件中没有重叠,必须读取和写入;实际上,任务是完全独立的。
谷歌搜索,似乎在Python 3.5中有一些native support用于此类事情,但不幸的是,我目前仅限于Python 3.4。进一步谷歌搜索似乎解决方案将涉及发电机和产量,但我发现的所有例子似乎比我试图做的复杂得多。
如果存在特定包,请随意推荐,但请注意,这不是"什么是最好的工具"题。我正在寻找一种简单可靠的方法来解决问题。
答案 0 :(得分:1)
您应该尝试使用if((*lista)==NULL)
{
return 1;
}
if(strcmp(((*lista)->word,aux))!=0)
{
return check(&(*lista)->next,aux);
}
return 0;
模块提供的高级API,尤其是multiprocessing
in the Python documentation。请记住,要在Python中运行真正的异步任务,由于全局解释器锁(GIL),您必须使用多处理而不是多线程。
答案 1 :(得分:1)
您应该阅读pool.map_async,我已经多次使用它来执行异步任务。 基本上你需要做的是写一个传递2个参数的函数,in_file和out_file,实例化池并将它与函数及其元组参数列表[(in_file1,out_file1),(in_file2,out_file2)相关联。 ..]。
小心!虽然文件可能不重叠,但您仍在使用IO设备,这会在等待读取和写入时产生大量开销,因此请尝试将文件的读取和写入与主逻辑分开,即读取文件,处理所有文件将数据存储在ram中,将文件写出来。
EDIT1:在python3中他们有starmap,根据我的理解,让你传递一个可迭代的迭代,迭代被解析为参数。所以我改变了代码以使用starmap。 此外,您应该考虑在一次迭代中添加超时,您可以使用get method。
来执行此操作我将包含一些示例代码(它在python2中,但逻辑/语法很容易转移):
import multiprocessing as mp
def foo(in_file, out_file):
in_data = ""
# this is just an example of how to read file
with open(in_file, "rb") as f:
for line in f:
in_data += line
...
out_data = process(in_data)
...
with open(out_file,'wb') as f:
f.write(out_data)
def main():
files =[("/infile1", "/outfile1"), ("/infile2", "/outfile2"), ...]
# you should choose how many processes you wish to instantiate.
# leaving it blank will assume the number of threads/core available.
pool = mp.Pool(processes=4)
pool.starmap_async(foo,files)