<p>问题似乎是您在每个线程中读取整个文件。然后,在</p>
<pre class="lang-py prettyprint-override"><code>for row in csv_reader:
data = name, lastname = row['name'], row['lastname']
</code></pre>
<p>只存储last(name,lastname)。我不熟悉csv模块,但我假设它返回一个生成器。
如果是这种情况,您可以共享生成器,使每个线程从中读取一次,或者为每个线程提供线程索引,使其可以忽略所有剩余的行</p>
<p>选项1:这并不总是保持文件顺序,但是如果您使用线程处理每一行,我想顺序并不重要。。。如果顺序很重要,线程可能不是最佳解决方案</p>
<pre class="lang-py prettyprint-override"><code>def print_names(csv_reader):
row = next(csv_reader)
data = name, lastname = row['name'], row['lastname']
screenlock.acquire()
print(name, lastname)
screenlock.release()
if __name__ == '__main__':
screenlock = threading.BoundedSemaphore(1)
with open('names.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
rows_count = len(list(csv_reader))
with open('names.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
threads = []
for _ in range(rows_count):
t = threading.Thread(target=print_names, args=(csv_reader,))
threads.append(t)
t.start()
for thread in threads:
thread.join()
</code></pre>
<p>选项2:这也不能确保订单的一致性。。。每个线程读取一次文件。。这可能是大型文件的一个巨大瓶颈</p>
<pre class="lang-py prettyprint-override"><code>def print_names(idx):
with open('names.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
row = [r for i,r in enumerate(csv_reader) if i == idx][0]
data = name, lastname = row['name'], row['lastname']
screenlock.acquire()
print(name, lastname)
screenlock.release()
if __name__ == '__main__':
screenlock = threading.BoundedSemaphore(1)
with open('names.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
rows_count = len(list(csv_reader))
threads = []
for idx in range(rows_count):
t = threading.Thread(target=print_names, args=(idx,))
threads.append(t)
t.start()
for thread in threads:
thread.join()
</code></pre>