php多线程抓取多个网页(Python如何多线程写同一文件?Python多线程文件写文件 )

优采云 发布时间: 2021-09-11 12:10

  php多线程抓取多个网页(Python如何多线程写同一文件?Python多线程文件写文件

)

  Python 如何在多个线程中写入同一个文件?

  Python 多线程写文件方案是只用一个线程写同一个文件。

  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()

  Python 多线程写入同一个文件:

  您永远不会在同一行看到凌乱的文本或在一行中间看到新行这一事实表明您实际上并不需要同步追加到文件。 Python 如何在多个线程中写入同一个文件的问题是:您使用 print 写入单个文件句柄。我怀疑 print 实际上在一次调用中对文件句柄执行了两个操作,并且这些操作在线程之间进行竞争。基本上 print 正在做类似的事情:

  file_handle.write('whatever_text_you_pass_it')

file_handle.write(os.linesep)

# Python多线程写同一文件

  Python 多线程写入文件。因为不同的线程同时对同一个文件句柄执行这个操作,有时一个线程在第一次写入时进入,然后另一个线程在第一次写入时进入。然后你会连续得到两个回车。或者真的是这些的任何排列。

  解决这个问题最简单的方法就是停止使用print,直接使用write。尝试这样的事情:

  output.write(f + os.linesep)

  以这种方式实现多线程写入同一个文件对我来说还是很危险的。我不确定对于使用相同文件句柄对象并竞争其内部缓冲区的所有线程,您可以期待什么保证。 Personal id 解决了整个问题,同时让每个线程都有自己的文件句柄。还请注意,这是有效的,因为写入缓冲区刷新的默认值是行缓冲,因此在刷新文件时,它会强制它使用行缓冲并使用 os.linesep 作为第三个参数发送 a1。打开。你可以这样测试:

  #!/usr/bin/env python

import os

import sys

import threading

def hello(file_name, message, count):

with open(file_name, 'a', 1) as f:

for i in range(0, count):

f.write(message + os.linesep)

if __name__ == '__main__':

#start a file

with open('some.txt', 'w') as f:

f.write('this is the beginning' + os.linesep)

#make 10 threads write a million lines to the same file at the same time

threads = []

for i in range(0, 10):

threads.append(threading.Thread(target=hello, args=('some.txt', 'hey im thread %d' % i, 1000000)))

threads[-1].start()

for t in threads:

t.join()

#check what the heck the file had

uniq_lines = set()

with open('some.txt', 'r') as f:

for l in f:

uniq_lines.add(l)

for u in uniq_lines:

sys.stdout.write(u)

  Python多线程写同一个文件,输出如下:

  hey im thread 6

hey im thread 7

hey im thread 9

hey im thread 8

hey im thread 3

this is the beginning

hey im thread 5

hey im thread 4

hey im thread 1

hey im thread 0

hey im thread 2

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线