#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. Большое спасибо. Это решило мою проблему.