将文件指针发送到 python 线程并更新文件指针

Send file pointer to python thread and update file pointer

我有一个带有线程的 python 程序,该线程应该写入一个文件。我将从主程序中生成一个线程。现在在新的一天触发我将更改主程序中的文件指针,我希望线程也使用新文件将数据写入文件。

我有一个代码可以使用全局变量来完成这个任务。但是还有其他更好的方法吗?

#!/usr/bin/env python
import sys
import threading
import time


filePtr = None

import time

def fileWriteTh():
    global filePtr
    time.sleep(2)
    filePtr.write("from the thrread this should in file 2")


def main():
    global filePtr
    filePtr = open("test1.txt","ab")
    fileThread = threading.Thread(target=fileWriteTh)
    fileThread.start()
    if new_day_trigger:
        filePtr.close()
        filePtr = open("test2.txt","ab")



    fileThread.join()


if __name__ == "__main__":
    main()

这是新编写的代码:

#!/usr/bin/env python
import sys
import threading
import time

class SendPacket(object):
    fileDesc = None
    def __init__(self, fd):
        super(SendPacket, self).__init__()
        SendPacket.fileDesc = fd

    def printFromInstance(self,var):
        print var
        SendPacket.fileDesc.write(var)
        time.sleep(3)
        print var
        SendPacket.fileDesc.write(var)
    def startabc(self, someVar):
        self.printFromInstance(someVar)

    @classmethod
    def printVar(cls, printStr):
        print printStr
        cls.fileDesc.write(printStr)
    @classmethod
    def changeClsFile(cls, newFd):
        cls.fileDesc = newFd


def main():
    filePtr = open("test1.txt","ab")

    sendPack_inst = SendPacket(filePtr)

    fileThread = threading.Thread(target=sendPack_inst.startabc, args=("test1",))

    fileThread.start()
    time.sleep(2)
    filePtr.close()

    filePtr = open("test2.txt","ab")

    SendPacket.changeClsFile(filePtr)

    fileThread.join()
    filePtr.close()

if __name__ == "__main__":
    main()         

像这样:

#!/usr/bin/env python
import sys
import thread
import time

class _fileACT :
    def __init__(self):
        self.trigger = 0
        self.flag = True
        self.msg = ""
        self.files = (open("test1.txt","ab"),open("test2.txt","ab"))
    def run(self,pssrg):
        while self.flag :
            if self.msg != "" :
                self.files[self.trigger].write(self.msg)
                self.msg = ""
    def test(self,pssrg):
        for i in range(20):
            time.sleep(1)
            if i %2 != 0 :
                self.trigger = 0
            elif i %2 != 1:
                self.trigger = 1

            self.msg = "%0.3d test-1,asdasdasd\n"%i
            time.sleep(0.5)
            print "wait..."

        self.flag = False
        for e in self.files : e.close()
        print "can exit !"

if __name__ == "__main__":
    fileACT = _fileACT()
    thread.start_new_thread(fileACT.run,(None,))
    thread.start_new_thread(fileACT.test,(None,))

我们有三个变量,文件名,最后打开的文件名和消息。两个文件,只有 False 和 True 就足够了(当然你可以对多个文件使用索引)。我们在 class 中编写了一个测试函数,因为我们不希望我们的主循环冻结。文件选择是用'trigger'完成的,但是前一个和下一个文件名不一样,前一个关闭。

线程中重要的一点是时间延迟是严格不可用的!时间延迟始终应用于触发器。时间延迟不能放在主循环中。还附加了从 class 外部访问的实例。希望对你有帮助。