gpt4 book ai didi

Python 多处理信号量不工作

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:08 24 4
gpt4 key购买 nike

我希望我的程序一次打印一行,但它一次打印多行并造成乱码。我似乎无法找出为什么信号量没有阻止多个进程相互打印。

我怎样才能让它尊重信号量?

这是我的代码的简化版本,它在运行时遇到了同样的问题(我在 Windows 上运行 Python 2.7.11(无法更改)):

import multiprocessing

rightofway = multiprocessing.Semaphore(1)

def writenum(number):
rightofway.acquire()
print("[+] - " + str(number))
rightofway.release()
return

def main():
starting = 0
ending = 50

list = range(starting, ending)

pool = multiprocessing.Pool(10)
pool.map(writenum, list)
return

#Required for Windows multiprocessing
if __name__ == '__main__':
main()

这是一个乱码输出的例子:

[+] - 0
[+] - 1
[+] - 2
[+] - 3
[+] - 4
[+] - 5
[+] - 6
[+] - 7
[[+] - 8
+] - 10[
+] - 9[+] - 11
[+] - 12

[[+] - 13+] - 14

[[+] - 15+] - 16

[[+] - 18+] - 17

[[+] - 19+] - 20

[[+] - 22+] - 21

[[+] - 23+] - 24

[[+] - 26+] - 25

[[+] - 27+] - 28

[[+] - 30+] - 29

[[+] - 31+] - 32

[[+] - 34+] - 33

[[+] - 35+] - 36

[[+] - 38+] - 37

[[+] - 39+] - 40

[[+] - 42+] - 41

[[+] - 43+] - 44

[[+] - 46+] - 45

[[+] - 47+] - 48

[+] - 49

这是我想要的输出示例(注意我不关心顺序):

[+] - 0
[+] - 1
[+] - 2
[+] - 3
[+] - 4
[+] - 5
[+] - 6
[+] - 7
[+] - 8
[+] - 9
[+] - 10
[+] - 11
[+] - 12
[+] - 13
[+] - 14
[+] - 15
[+] - 16
[+] - 17
[+] - 18
[+] - 19
[+] - 20
[+] - 21
[+] - 22
[+] - 23
[+] - 24
[+] - 25
[+] - 26
[+] - 27
[+] - 28
[+] - 29
[+] - 30
[+] - 31
[+] - 32
[+] - 33
[+] - 36
[+] - 34
[+] - 35
[+] - 37
[+] - 38
[+] - 40
[+] - 39
[+] - 41
[+] - 42
[+] - 44
[+] - 43
[+] - 45
[+] - 46
[+] - 48
[+] - 47
[+] - 49

最佳答案

你的问题类似于this one .

来自多处理编程指南。

Explicitly pass resources to child processes

... it is better to pass the object as an argument to the constructor for the child process.

Apart from making the code (potentially) compatible with Windows ...

在 Windows 上,您需要将共享对象传递给 Process 构造函数参数列表。否则,子进程将获得一个全新的副本,而不是父进程的副本。这就是为什么您会觉得 Semaphore 不工作的原因。这两个进程正在创建自己不同的 Semaphore 对象,而不是共享同一个对象。

要将 Semaphore 对象传递给 Windows 上的 Pool,您需要费点功夫,但不要太多。由于您不能将Semaphore 对象直接传递给writenum 函数,您需要依赖于Pool initializer

from multiprocessing import Semaphore, Pool

mutex = None

def initializer(semaphore):
"""This function is run at the Pool startup.
Use it to set your Semaphore object in the child process.

"""
global mutex

mutex = semaphore

def writenum(args):
with mutex:
print "[+] - " + str(number)

def main():
semaphore = Semaphore()
pool = Pool(initializer=initializer, initargs=[semaphore])

numbers = range(50)

pool.map(writenum, numbers)

编辑:刚注意到我写的是Lock 而不是Semaphore。核心推理保持不变。

关于Python 多处理信号量不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50379009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com