python - Python多处理信号量不起作用
问题描述
我希望我的程序一次打印一行,但是它一次打印多行并造成乱码。我似乎无法找出为什么信号量不能阻止多个进程相互打印。
我怎样才能让它尊重信号量?
这是我的代码的简化版本,在运行时遇到了同样的问题(我在 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
解决方案
你的问题和这个类似。
来自多处理编程指南。
将资源显式传递给子进程
...最好将对象作为参数传递给子进程的构造函数。
除了使代码(可能)与Windows兼容...
在 Windows 上,您需要将共享对象传递给 Process 构造函数参数列表。否则,子进程将获得一个全新的副本,而不是父进程的副本。这就是为什么你会觉得它Semaphore
不起作用。这两个进程正在创建自己不同的Semaphore
对象,而不是共享同一个对象。
要将Semaphore
对象传递给Pool
Windows 上的 a ,您需要付出一些努力,但不要太多。由于您无法将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)
编辑:刚刚注意到我写了 aboutLock
而不是Semaphore
. 核心推理保持不变。
推荐阅读
- android - 过期后如何在 Flutter 应用程序中更新 Firebase 令牌并存储它?
- java - 为什么我的图形邻接列表不起作用?
- javascript - why neither document or window is defined
- python - Python - 按最小值排序列表
- java - 如何在 MainActivity 中获取 ViewPager 创建的 Fragment 的元素?
- c - 如何利用 txt 文件中的换行符将 lcd 光标移至下一行?
- docker - How to stop running Container, if error response from daemon is: Cannot Kill Container [...] permission denied?
- python - Python。计算数据框列值中的共现
- dart - 飞镖语言 readAsString 会改变行尾吗?
- angular - Ionic 4 Angular 从 API 获取响应不起作用。通过邮递员,我得到了正确的