Angenommen, ich habe eine sehr große Textdatei, die aus vielen Zeilen besteht, die ich gerne umkehren würde. Und mir ist die endgültige Bestellung egal. Die Eingabedatei enthält kyrillische Symbole. Ich verwende multiprocessing
, um auf mehreren Kernen zu verarbeiten.Warum blockiert multiprocessing.Lock() keine freigegebene Ressource in Python?
# task.py
import multiprocessing as mp
POOL_NUMBER = 2
lock_read = mp.Lock()
lock_write = mp.Lock()
fi = open('input.txt', 'r')
fo = open('output.txt', 'w')
def handle(line):
# In the future I want to do
# some more complicated operations over the line
return line.strip()[::-1] # Reversing
def target():
while True:
try:
with lock_read:
line = next(fi)
except StopIteration:
break
line = handle(line)
with lock_write:
print(line, file=fo)
pool = [mp.Process(target=target) for _ in range(POOL_NUMBER)]
for p in pool:
p.start()
for p in pool:
p.join()
fi.close()
fo.close()
Dieses Programm wird mit Fehler:
Process Process-2:
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "task.py", line 22, in target
line = next(fi)
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "task.py", line 22, in target
line = next(fi)
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 0: invalid continuation byte
Auf der anderen Seite, alles funktioniert gut, wenn ich gesetzt POOL_NUMBER = 1
ich ein solches Programm geschrieben haben. Aber es macht keinen Sinn, wenn ich die Gesamtleistung erreichen möchte.
Warum passiert dieser Fehler? Und wie kann ich es reparieren?
Ich verwende Python 3.5.2
.
I erzeugten Daten dieses Skript:
# gen_file.py
from random import randint
LENGTH = 100
SIZE = 100000
def gen_word(length):
return ''.join(
chr(randint(ord('а'), ord('я')))
for _ in range(length)
)
if __name__ == "__main__":
with open('input.txt', 'w') as f:
for _ in range(SIZE):
print(gen_word(LENGTH), file=f)
Sie auf eine Antwort finden können über [einzelne Datei aus mehreren Prozessen in Python wird bearbeitet] (https : //stackoverflow.com/a/11196615/4662041) – Sheshnath
haben Sie versucht, diese Datei zu lesen und ihre Daten zu drucken? wenn du diesen Fehler wieder fängst! das heißt du solltest es lesen, als binärer modus mit "rb" ... – DRPK
@DRPK habe ich gemacht. Wenn ich 'line = handle (line)' aus meinem Skript lösche, kommt der gleiche Fehler. – Fomalhaut