多处理计数器和多次打印

2024-04-25 04:58:33 发布

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

我试图弄清楚如何实现一个print语句,该语句在一个有一个worker池的函数中只打印一次。因此,如果池中有2个线程在运行,我只需要1个线程来打印它。我试图通过使用一个计数器来实现这一点,我一直在搞混多重处理。值以这种方式将正确递增,但我现在删除了它。每次计数器点击5,它就会从计数器中减去5,然后打印一些东西

from multiprocessing import Pool, Value, Lock
from colorama import Fore
counter = 0
def check(line):
    counter+=1
    if counter == 5:
        counter-=5
        print(Fore.YELLOW + "Counter Reached 5")
    else:
        pass
    #my other code here that normally gets executed 
def main():
    #args.threads is taken from an argument given by the user before program starts
    pool = Pool(args.threads)
    pool.daemon = True
    results = pool.map(check, arrange)

当然,它们更多的是代码,但这正是我需要帮助的地方。当计数器达到5时,我只需要一个线程来打印某些内容,而不是池中的所有线程


Tags: fromimportdefcheckcounter计数器args语句
1条回答
网友
1楼 · 发布于 2024-04-25 04:58:33

这里有一个与上面内容相近的快速示例

import time
import multiprocessing as mp
from multiprocessing import Pool, Value, Lock

counter = Value('i',0)  # integer value starting at 0
lock = Lock()

def check(line):
    with lock:
        counter.value += 1
    if counter.value == 5:
        with lock:
            counter.value -= 5
        print('Counter Reached 5 in process ', mp.current_process() )
        return 1
    else:
        time.sleep(0.1)
        return 0

pool = Pool(processes=4)
results = pool.map(check, range(15))
print(results)

这就给出了(请注意,首先到达'5'的过程是随机的)

Counter Reached 5 in process  <ForkProcess(ForkPoolWorker-1, started daemon)>
Counter Reached 5 in process  <ForkProcess(ForkPoolWorker-2, started daemon)>
Counter Reached 5 in process  <ForkProcess(ForkPoolWorker-1, started daemon)>
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]

修改Lock()Value将防止潜在的争用问题。如果删除with lock:行并多次运行上述代码,您将看到由于竞争条件的原因,它只会间歇性地打印两次。关于Lock{a1}有一个很好的讨论

相关问题 更多 >