Python线程问题,不工作,我需要确保线程不读取同一行



所以这是我第一次玩线程所以请与我在这里。在我的主应用程序(我将实现这一点),我需要添加多线程到我的脚本。该脚本将从文本文件读取帐户信息,然后登录&用这个账户做一些任务。我需要确保线程不会从帐户文本文件中读取同一行,因为这会把一切都搞砸,我不太确定如何做。

from multiprocessing import Queue, Process
from threading import Thread
from time import sleep
urls_queue = Queue()
max_process = 10
def dostuff():
with open ('acc.txt', 'r') as accounts:
for account in accounts:
account.strip()
split = account.split(":")
a = {
'user': split[0],
'pass': split[1],
'name': split[2].replace('n', ''),
}
sleep(1)
print(a)
for i in range(max_process):
urls_queue.put("DONE")
def doshit_processor():
while True:
url = urls_queue.get()
if url == "DONE":
break
def main():
file_reader_thread = Thread(target=dostuff)
file_reader_thread.start()
procs = []
for i in range(max_process):
p = Process(target=doshit_processor)
procs.append(p)
p.start()
for p in procs:
p.join()
print('all done')
# wait for all tasks in the queue
file_reader_thread.join()

if __name__ == '__main__':
main()

所以目前我认为线程甚至没有工作,因为它每秒打印一个帐户,即使有10个线程。所以它应该每秒打印10个账户,但它不是,这让我很困惑。我也不知道如何确保线程不会选择相同的帐户行。我非常感激你的帮助。

问题是,您创建了一个线程来为您的进程生成数据,但随后不将该数据发布到队列。你在一个线程中睡觉,所以你看到每秒生成一个项目,然后…没有,因为项目没有排队。似乎您所做的一切都是创建一个进程池,内置的multiprocessing.Pool应该为您工作。

我设置了池"块大小"低,以便工人一次只给1个工作项目。这对于处理时间因每个工作项而异的工作流很有用。默认情况下,pool尝试针对处理时间大致相等的情况进行优化,而不是尝试减少进程间通信时间。

您的数据看起来像一个冒号分隔的文件,您可以使用csv来减少那里的处理。这个较小的脚本应该可以满足您的要求。

import multiprocessing as mp
from time import sleep
import csv
max_process = 10
def doshit_processor(row):
time.sleep(1) # if you want to simulate work
print(row)
def main():
with open ('acc.txt', newline='') as accounts:
table = list(csv.DictReader(accounts, fieldnames=('user', 'pass', 'name'),
delimiter=':')
with mp.Pool(max_process) as pool:
pool.map(doshit_processor, table, chunksize=1)
print('all done')
if __name__ == '__main__':
main()

相关内容

  • 没有找到相关文章

最新更新