Как непрерывно записывать данные в файл, не блокируя основной цикл в Python

#python #multithreading #loops #file #asynchronous

Вопрос:

Я новичок в Python, и у меня есть сценарий, в котором я хочу записать данные измерений в 2 файла: один файл в main() функции и другой файл в функции WriteToFile() , которая каждые 10 секунд записывает новую строку данных. Как я могу сделать WriteFile() так, чтобы меня уволили один раз в main() цикле, а затем запускали до 2 минут после завершения main() итерации цикла? Как я могу затем WriteToFile() изящно выйти CleanUp() , убедившись, что FastFile.txt он закрылся правильно? Вот упрощенный пример программы:

 from datetime import datetime import os import time import sys import random  M_Max = 2000 M_Array = [740]  D_Array = [5, 10, 20, 100, 150, 200, 400,600, 740]     M=random.random()*20000 D=random.random()*7500   #write data to a file every ten seconds  def WriteToFile():   while True:  h = open("FastFile.txt", "a")  current_time_t=datetime.now().strftime("%d.%m.%y %H:%M:%S")  p = random.random()*1000  c = random.random()*100    print("Fast_Time :", '{} {:9.0f} {:9.0f} {:9.3f} {:9.1f} '.format(current_time_t, M, D, p, c))   h.write("n %s , %s , %s , %s, %s " % (current_time_t, str('{:.1f}'.format(M)), str('{:.1f}'.format(D)), str('{:.3f}'.format(p)), str('{:.2f}'.format(  c))))  h.close()  time.sleep(10)         def CleanUp():  print("Cleaning up")    #wait two minutes then stop WriteToFile()  time.sleep(120)  sys.exit()    print("Done")     def main():  global M, D    WriteToFile() # call this function and start writing data including the global variables M and N generated here   print("Starting measurement")  time.sleep(3)    for M in M_Array:   for D in D_Array:     p = random.random()*1000  c = random.random()*100   g = open("SlowFile.txt", "a")     current_time_t = datetime.now().strftime("%d.%m.%y %H:%M:%S")   print("Main_Time :", '{} {:9.0f} {:9.0f} {:9.3f} {:9.1f} '.format(current_time_t, M, D, p, c))    #write the result of each iteration to a file  g.write("n %s , %s , %s , %s, %s " % (current_time_t, str('{:.1f}'.format(M)), str('{:.1f}'.format(D)), str('{:.3f}'.format(p)), str('{:.2f}'.format(  c))))  g.close()    CleanUp()   if __name__ == "__main__":  main()  

Я использую Python 3.5.3 , но могу обновить, чтобы приспособить решения, требующие более высоких версий Python.

Комментарии:

1. вы можете использовать многопроцессорную обработку

Ответ №1:

Тебе нужно threading ! Ваш if __name__="__main__" должен быть таким, как показано ниже:

 if __name__ == "__main__":  t1 = threading.Thread(target=WriteToFile)  t2 = threading.Thread(target=loop) # put the loop in a new function and call it using this  t1.start()  t2.start()  t1.join()  t2.join()  

Ваша main() функция должна быть переименована в цикл или во что угодно, без вызова WriteToFile() . Не забудьте импортировать потоки в начале кода.

Комментарии:

1. Большое спасибо. Это решило мою проблему.