Python线程将任务重复两次,而不是两个不同的任务

2024-04-25 00:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在编写一个程序,它循环遍历卡号列表,然后用这些卡号调用函数。我编写了一些基本的python线程代码,循环遍历从cards.txt文件获得的列表,然后生成了用户定义数量的线程。然而,这是我不喜欢的行为,因为它只是产生具有相同卡号的线程。我可以理解为什么会发生这种情况,因为for循环位于卡循环的下面,导致它接受相同的卡号。然而,我不知道如何解决这个问题。我查看了线程池,但这仍然不能解决我的问题,因为for循环仍然是嵌套的。这里是一些相关的代码,非常感谢您的帮助

for card in cards:
    threads = []
    card = card.strip()
    for i in range(threads2):
        x = threading.Thread(target=exampleFunct, args=(card,))
        threads.append(x)
        x.start()
    for thread in threads:
        thread.join()

我再一次明白了为什么在for card in cards:内部运行for循环会产生这种行为,但我看不到出路。非常感谢您的帮助


Tags: 文件代码用户in程序txt列表for
2条回答

你是对的,这是线程的顺序。一种选择是提前生成所有线程,然后使用队列或类似的方法发送它们工作。大概是这样的:

import threading
import queue

cards = ["5\n", "32", "56", "34\n"]
thread_count = 2


def exampleFunct(q):
    while True:
        print('Thread waiting for card and int')
        card_and_int = q.get()
        if card_and_int is None:
            print('That means we are all done')
            break
        card, number = card_and_int
        print("card {}, number {}".format(card, number))


q = queue.Queue()
threads = []
for i in range(thread_count):
    t = threading.Thread(target=exampleFunct, args=(q,))
    threads.append(t)
    t.start()

for i, card in enumerate(cards):
    card = card.strip()
    q.put((card, i))
    
# Stop all the threads
for i in range(thread_count):
    q.put(None)

# and wait for them to exit
for thread in threads:
    thread.join()

我看不出问题出在哪里,但我想知道你是否可以再解释一下你想要实现的目标。我做了一些代码,可以独立运行,也许这会有所帮助

cards = ["5\n", "32", "56", "34\n"]
threads2 = 2


def exampleFunct(card: str, number: int):
    print("card {}, number {}".format(card, number))


for card in cards:
    threads = []
    card = card.strip()
    for i in range(threads2):
        x = threading.Thread(target=exampleFunct, args=(card, i))
        threads.append(x)
        x.start()

    for thread in threads:
        thread.join()

print("done")

输出在下面,它确实在卡号之间循环

card 5, number 0
card 5, number 1
card 32, number 0
card 32, number 1
card 56, number 0
card 56, number 1
card 34, number 0
card 34, number 1
done

相关问题 更多 >