【发布时间】:2025-12-22 13:25:11
【问题描述】:
我在 Google 上搜索了一下,以了解如何正确构建计数器以跟踪已完成工作的进度。到目前为止,似乎所有答案都涉及使用lock 和Value。
我想知道是否可以使用回调来实现它。似乎回调是在主进程中执行的,而不是工人所在的子进程。我可以进一步假设它是在同一个线程中执行的,因此根本没有竞争条件吗?
import time
import multiprocessing
import os
Pool = multiprocessing.Pool
def sqr(a):
time.sleep(0.5)
print 'local {}'.format(os.getpid())
return a * a
pool = Pool(processes=4)
class Counter(object):
def __init__(self):
self.value = 0
def incr(self, x):
self.value += 1
print 'count {}'.format(self.value)
print 'callback {}'.format(os.getpid())
counter = Counter()
r = [pool.apply_async(sqr, (x,), callback=counter.incr) for x in range(10)]
pool.close()
pool.join()
local 27155local 27154local 27156
count 1
callback 27152
count 2
callback 27152
count 3
callback 27152
local 27153
count 4
callback 27152
local 27155
count 5
callback 27152
local 27156
local 27154
count 6
callback 27152
count 7
callback 27152
local 27153
count 8
callback 27152
local 27155
count 9
callback 27152
local 27156
count 10
callback 27152
main 27152
main count 10
Process finished with exit code 0
更新
好的,看来link 解释了一些回调背后的机制。
所以实际上它在主进程的不同线程上运行。
但是,我仍然可以以相同的方式实现计数器吗,因为只有 1 个线程可以修改计数器?
【问题讨论】:
标签: python multiprocessing python-multiprocessing