调用耗时函数时Python for循环流

时间:2016-01-28 23:31:24

标签: python function python-2.7 for-loop

我已经实现了以下代码:

lines=[]
    with open('path_to_file', 'r+') as source:
        for line in source:
            line = line.replace('\n','').strip()
            if line.split()[-1] != 'sent':
                # do some operation on line without 'sent' tag
                upload(data1.zip)
                upload(data2.zip) 
                do_operation(line)
                # tag the line
                line += '\tsent'
            line += '\n'
            # temporary save lines in a list
            lines.append(line)
        # move position to start of the file
        source.seek(0)
        # write back lines to the file
        source.writelines(lines)

我在#do some operation with lines without sent tag部分调用上传方法,将数据上传到云端。由于数据有点大(约1GB),因此完成上传需要一段时间。与此同时,for循环是否会继续调用upload(data2)?我收到错误,因为我无法同时上传。

如果是,我该如何避免这种情况?

EDIT :::

我已将上传功能更改为上传后返回状态。那么,如何修改我的主循环以便它在调用upload(data1.zip)之后等待,然后转到upload(data2.zip)。我想同步..

3 个答案:

答案 0 :(得分:2)

我认为您的问题可能是您不想尝试一次上传多个文件。

您的代码不会尝试进行任何并行上传。所以我怀疑你的upload()函数正在启动上传过程,然后让它在返回给你的同时在后台运行。

如果是这样,您可以尝试其中一些选项:

  1. 将一个选项传递给upload函数,该函数告诉它等到上传完成后再返回。

  2. 发现(研究)一些可用于将程序与upload函数启动的进程同步的属性。例如,如果函数返回子进程ID,则可以在该pid上执行wait来完成。或者它可能会将pid写入pidfile - 您可以读取该数字,然后等待它。

  3. 如果您不能使上传功能同步执行您想要的操作,您可以考虑使用print语句替换对upload()的调用,以使您的代码生成某种可执行的脚本单独使用,可能使用不同的环境或使用不同的上传工具。

答案 1 :(得分:1)

您可以将它们作为独立进程发送出去。使用Python multiprocessing模块;还有很好的tutorials

您的内部循环可能如下所示:

up1 = Process(target=upload, args=(data1.zip,))
up2 = Process(target=upload, args=(data2.zip,))
up1.start()
up2.start()

# Now, do other stuff while these run
do_operation(line)
# tag the line
line += '\tsent'

# Wait for the uploads to finish -- in case they're slower than do_operation.
up1.join()
up2.join()
flag
  

@Prune是的我很困惑..我想要同步。

出色;我们已经 清理了。您同步的内容是单独的进程。您的主要流程正在等待子流程的结果,上传。多个进程称为......: - )

我们现在处于解决方案吗?我认为你需要的部分是这些答案中的一个(或最多两个)。

答案 2 :(得分:1)

您可以使用multiprocessing执行耗时的工作。

import multiprocessing


# creates processes for your files, each file has its own processor
processes = [multiprocessing.Process(target=upload, args=(zip_file,)) for zip_file in [data1.zip,data2.zip]]

# starts the processes
for p in processes:
    p.start()

# waits for all processes finish work
for p in processes:
    p.join()

# It will not go here until all files finish uploading.
...
...