将文件指针发送到 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 外部访问的实例。希望对你有帮助。
我有一个带有线程的 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 外部访问的实例。希望对你有帮助。