如何在Python 3.4中执行异步任务?

时间:2016-02-04 18:44:43

标签: python asynchronous

我正在尝试编写一个程序,该程序从文件中检索要执行的任务列表,并异步执行任务。每个任务都有以下形式:从文件中读取数据,进行一些计算(需要几分钟),然后将结果写入另一个文件。文件中没有重叠,必须读取和写入;实际上,任务是完全独立的。

谷歌搜索,似乎在Python 3.5中有一些native support用于此类事情,但不幸的是,我目前仅限于Python 3.4。进一步谷歌搜索似乎解决方案将涉及发电机和产量,但我发现的所有例子似乎比我试图做的复杂得多。

如果存在特定包,请随意推荐,但请注意,这不是"什么是最好的工具"题。我正在寻找一种简单可靠的方法来解决问题。

2 个答案:

答案 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)