thực tế là bạn không bao giờ nhìn thấy văn bản lộn xộn trên cùng một dòng hoặc dòng mới ở giữa của một dòng là một đầu mối mà bạn thực sự không cần phải bộ hóa phụ thêm vào tập tin. vấn đề là bạn sử dụng in để ghi vào một tập tin đơn. tôi nghi ngờ print
thực sự đang thực hiện 2 thao tác để xử lý tệp trong một cuộc gọi và các hoạt động đó đang chạy đua giữa các chuỗi. về cơ bản print
đang làm một cái gì đó như:
file_handle.write('whatever_text_you_pass_it')
file_handle.write(os.linesep)
và vì chủ đề khác nhau đang làm điều này cùng một lúc trên tay cầm cùng một tập tin đôi khi một thread sẽ nhận được trong ghi đầu tiên và các chủ đề khác sau đó sẽ nhận được trong ghi đầu tiên và sau đó bạn sẽ nhận được hai trở về vận chuyển trong một hàng. hoặc thực sự bất kỳ hoán vị nào trong số này.
cách đơn giản nhất để giải quyết vấn đề này là ngừng sử dụng print
và chỉ sử dụng trực tiếp write
. hãy thử một cái gì đó như thế này:
output.write(f + os.linesep)
điều này vẫn có vẻ nguy hiểm đối với tôi. im không chắc chắn những gì gaurantees bạn có thể mong đợi với tất cả các chủ đề bằng cách sử dụng cùng một đối tượng xử lý tập tin và contending cho bộ đệm nội bộ của nó. cá nhân id bên bước toàn bộ vấn đề và chỉ có mỗi thread có được xử lý tập tin riêng của mình. cũng lưu ý rằng điều này làm việc vì mặc định cho xóa bộ đệm flushes là dòng đệm, do đó, khi nó làm một tuôn ra vào tập tin nó kết thúc trên một os.linesep
. để buộc nó sử dụng bộ đệm dòng, hãy gửi một số 1
làm đối số thứ ba của open
. bạn có thể kiểm tra nó ra như thế này:
#!/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)
Kết quả trông như thế này:
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
Nguồn
2017-09-23 02:03:47
bài viết một số mã, mà có thể giúp. –
nối thêm một dòng mới. – Kuf
Âm thanh như * impossibru *. – plaes