我已经实现了以下代码:
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)
。我想同步..
答案 0 :(得分:2)
我认为您的问题可能是您不想尝试一次上传多个文件。
您的代码不会尝试进行任何并行上传。所以我怀疑你的upload()
函数正在启动上传过程,然后让它在返回给你的同时在后台运行。
如果是这样,您可以尝试其中一些选项:
将一个选项传递给upload
函数,该函数告诉它等到上传完成后再返回。
发现(研究)一些可用于将程序与upload
函数启动的进程同步的属性。例如,如果函数返回子进程ID,则可以在该pid上执行wait
来完成。或者它可能会将pid写入pidfile - 您可以读取该数字,然后等待它。
如果您不能使上传功能同步执行您想要的操作,您可以考虑使用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.
...
...