Python-从多个线程追加到同一文件

发布于 2021-01-29 18:29:55

我正在编写一个将多个线程的行附加到同一文件的应用程序。

我有一个问题,其中某些行被追加而没有新行。

有什么解决办法吗?

class PathThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def printfiles(self, p):
        for path, dirs, files in os.walk(p):
            for f in files:
                print(f, file=output)

    def run(self):
        while True:
            path = self.queue.get()
            self.printfiles(path)
            self.queue.task_done()


pathqueue = Queue.Queue()
paths = getThisFromSomeWhere()

output = codecs.open('file', 'a')

# spawn threads
for i in range(0, 5):
    t = PathThread(pathqueue)
    t.setDaemon(True)
    t.start()

# add paths to queue
for path in paths:
    pathqueue.put(path)

# wait for queue to get empty
pathqueue.join()
关注者
0
被浏览
163
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    解决方案是仅在一个线程中写入文件。

    import Queue  # or queue in Python 3
    import threading
    
    class PrintThread(threading.Thread):
        def __init__(self, queue):
            threading.Thread.__init__(self)
            self.queue = queue
    
        def printfiles(self, p):
            for path, dirs, files in os.walk(p):
                for f in files:
                    print(f, file=output)
    
        def run(self):
            while True:
                result = self.queue.get()
                self.printfiles(result)
                self.queue.task_done()
    
    class ProcessThread(threading.Thread):
        def __init__(self, in_queue, out_queue):
            threading.Thread.__init__(self)
            self.in_queue = in_queue
            self.out_queue = out_queue
    
        def run(self):
            while True:
                path = self.in_queue.get()
                result = self.process(path)
                self.out_queue.put(result)
                self.in_queue.task_done()
    
        def process(self, path):
            # Do the processing job here
    
    pathqueue = Queue.Queue()
    resultqueue = Queue.Queue()
    paths = getThisFromSomeWhere()
    
    output = codecs.open('file', 'a')
    
    # spawn threads to process
    for i in range(0, 5):
        t = ProcessThread(pathqueue, resultqueue)
        t.setDaemon(True)
        t.start()
    
    # spawn threads to print
    t = PrintThread(resultqueue)
    t.setDaemon(True)
    t.start()
    
    # add paths to queue
    for path in paths:
        pathqueue.put(path)
    
    # wait for queue to get empty
    pathqueue.join()
    resultqueue.join()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看