【发布时间】:2016-03-14 13:58:56
【问题描述】:
我有以下代码,它的行为很奇怪。
class A:
def __init__(self):
self.lock = Lock()
self.process_list = []
self.event_list = []
def run(self):
self.process_list = []
counter = 0
n = 0
while (n<1000):
n += 1
print("in while again")
self.lock.acquire()
print('after acquired lock')
self.lock.release()
self.event_list.append(Event())
print('add event')
p = Process(target=workerEmulator().run,
args=(self.lock, self.event_list[counter]))
print('create process')
self.process_list.append(p)
print('add process')
self.event_list[counter].clear()
counter += 1
print("about to start process")
print("n="+str(n))
p.start()
print("new process started")
print(": main process, active_children: " + str(multiprocessing.active_children()))
del_list = [] # the list for storing index of the process/event to delete
for i in range(len(self.event_list)):
if (self.event_list[i].is_set()):
self.process_list[i].join()
print("one process finished, its exit code: " + str(self.process_list[i].exitcode))
print("this process is alived or not? " + str(self.process_list[i].is_alive()))
del_list.append(i)
del_list.sort(reverse=True)
for i in del_list:
del self.event_list[i]
del self.process_list[i]
counter -= 1
time.sleep(0.1)
for p in self.process_list:
p.join()
print("one process finished, its exit code: " + str(p.exitcode))
print("this process is alived or not? " + str(p.is_alive()))
class workerEmulator:
def __init__(self):
pass
def run(self, lock, event):
print("a new process")
self.lock = lock
self.event = event
time.sleep(20)
print("after sleep")
self.lock.acquire()
print("in lock")
self.lock.release()
self.event.set()
if __name__ == '__main__':
a = A()
a.run()
正如我所想,每个打印语句都应该执行 1000 次。然而,事实并非如此,总是有几次缺失,然后如果我们看 n,我注意到 n 会跳过某个数字,例如,... n=798...n=799.. .n=801...n=802...(n=800 缺失)。我不明白为什么会发生这种情况,有人可以帮忙吗?
【问题讨论】:
-
1000 人中有多少人遗漏了(您计算过的最小值和最大值),它的一致性如何?每次运行总是相同的数字还是随机的?由于您不依赖任何类型的锁定来保留打印输出,您是否确认文本没有在另一个进程的输出中拆分,例如“一个新的8进程0”?
-
一般不超过10次,我在测试2到8次,但肯定会损失一些。锁定打印是一个很好的建议,让我尝试禁用子进程的输出。 @MattJordan
-
@MattJordan 是的,你是对的,禁用子输出后,问题就解决了!谢谢!
标签: python python-multiprocessing