【问题标题】:How to write data to a file continuously without blocking main loop in Python如何在不阻塞 Python 主循环的情况下连续将数据写入文件
【发布时间】:2021-12-08 04:38:58
【问题描述】:

我是 Python 新手,我有一个场景,我想将测量数据写入 2 个文件,main() 函数中的一个文件和WriteToFile() 函数中的另一个文件,每 10 次写入一行新数据秒。 如何使WriteFile()main() 循环中被触发一次,然后在main() 循环迭代完成后运行2 分钟?然后我怎样才能在CleanUp() 中优雅地退出WriteToFile(),确保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 的解决方案。

【问题讨论】:

  • 你可以使用多处理

标签: python multithreading loops file asynchronous


【解决方案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()。 记得在代码开头导入线程。

【讨论】:

  • 非常感谢。这解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2019-09-12
  • 2020-02-17
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多