加了进程锁之后为什么会报错
来源:3-4 多进程中的锁
MaxLu
2020-05-31 18:35:15
代码:
import time
import random
from multiprocessing import Process, Lock
class WriteProcess(Process):
""" 写入文件 """
def __init__(self, file_name, num, my_lock, *args, **kwargs):
# 文件的名称
self.file_name = file_name
self.num = num
# 锁对象
self.my_lock = my_lock
super().__init__(*args, **kwargs)
def run(self):
""" 写入文件的主要业务逻辑 """
try:
# 添加锁
self.my_lock.acquire()
for i in range(5):
content = '现在是: {0}: {1}---{2} \n'.format(self.name, self.pid, self.num)
with open(self.file_name, 'a+', encoding='utf-8') as f:
f.write(content)
time.sleep(random.randint(1, 5))
print(content)
finally:
# 释放锁
self.my_lock.release()
if __name__ == "__main__":
file_name = 'test_txt'
# 锁的对象
my_lock = Lock()
for x in range(5):
p = WriteProcess(file_name, x, my_lock)
p.start()
报错信息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
Process finished with exit code 0
3回答
好帮手慕笑蓉
2020-06-01
同学,你好。老师在win系统,和linux系统都做过测试,代码没有出现报错问题,不过在python的bug中有和同学截图一样的报错记录,如:
上面建议的解决方案是将默认的start恢复到“fork”,同学可以使用multiprocessing.set_start_method('fork')代码写入main函数里试一下:
若还是报错,可将操作系统、python版本等信息提供,再次提问。
祝学习愉快~
MaxLu
提问者
2020-05-31
好帮手慕笑蓉
2020-05-31
同学,你好。老师这边测试同学得代码是没有报错的,请同学将操作步骤截图到问答区,方便老师快速定位问题产生的原因。
祝学习愉快~
相似问题