2016-01-28 4 views
0

Я осуществил следующий код:Python для потока контура при вызове функции трудоёмким

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 для загрузки данных в облаке. Поскольку данные немного большие (около 1 ГБ), для завершения загрузки требуется некоторое время. В то же время, цикл for идет дальше, чтобы позвонить upload(data2)? Я получаю ошибки, поскольку я не могу загрузить одновременно.

Если да, то как я могу избежать этого?

EDIT :::

Я изменил функцию загрузки, чтобы вернуть статус, как это сделано после загрузки. Итак, как я могу изменить свой основной цикл, чтобы он подождал после вызова upload(data1.zip), а затем переместился на upload(data2.zip). Я хочу синхронизировать ..

+1

Один из нас смущен (да, он все еще может быть мной). Вы хотите дождаться возвращаемого значения, но вы не хотите многопроцессорности. Выполнение параллельных операций * - это многопроцессорность. Ожидание результата - это синхронизация, которая является функцией ** join ** выше. Можете ли вы уточнить свои потребности для нас? – Prune

+0

@Prune да его меня кто смущает .. я хочу синхронизировать .. – learnningprogramming

ответ

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 да это я, кто путается .. я хочу синхронизировать.

Excellent; есть это удален. То, что вы синхронизируете, - это отдельные процессы. У вас есть основной процесс, ожидающий результата вашего дочернего процесса, загрузить. Многочисленные процессы называются ... :-)

Мы находимся сейчас на точке решения? I думаю штук, в которых вы нуждаетесь, находятся в одном (или не более двух) этих ответах.

+0

отредактировал мой вопрос немного .. как я могу это сделать без miltipcessing – learnningprogramming

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. 
... 
... 
+0

Я отредактировал мой вопрос. как это можно сделать без многопроцессорности? – learnningprogramming

2

Я думаю, что ваша проблема может заключаться в том, что вы не хотите загружать более одного файла за раз.

Ваш код не пытается выполнять параллельные загрузки. Поэтому я подозреваю, что ваша функция upload() запускает процесс загрузки, а затем позволяет запустить его в фоновом режиме, пока он возвращается к вам.

Если это так, то вы можете попробовать некоторые из этих вариантов:

  1. Передает опцию функции upload, что говорит его ждать, пока загрузка не завершится, прежде чем вернуться.

  2. Ознакомьтесь с некоторыми атрибутами, которые вы можете использовать для синхронизации вашей программы с процессом, запущенным функцией upload. Например, если функция возвращает идентификатор дочернего процесса, вы можете сделать wait на этом pid для завершения. Или, возможно, он пишет pid в pidfile - вы можете прочитать номер и ждать его.

  3. Если вы не можете заставить функцию загрузки выполнять то, что вы хотите синхронно, вы можете рассмотреть возможность замены вызовов на upload() с помощью операторов печати, чтобы ваш код генерировал какой-то скрипт, который может быть выполнен отдельно, возможно с другой средой или с помощью другой утилиты загрузки.

+0

Я отредактировал функцию загрузки для возврата (статус) после завершения загрузки .. как можно запросить цикл, чтобы ждать возвращаемого значения. Исправьте основной вопрос., New для python – learnningprogramming

+0

Если функция загрузки ожидает загрузки Чтобы закончить, тогда вам должно быть хорошо идти. Если у вас все еще есть проблемы с параллельными загрузками, можете ли вы изменить свой вопрос, включив источник функции 'upload()'? –

Смежные вопросы