加了进程锁之后为什么会报错

来源: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中有和同学截图一样的报错记录,如:

http://img.mukewang.com/climg/5ed4677f09b0c3d915230304.jpg

上面建议的解决方案是将默认的start恢复到“fork”,同学可以使用multiprocessing.set_start_method('fork')代码写入main函数里试一下:

http://img.mukewang.com/climg/5ed46826092042ae05890073.jpg

若还是报错,可将操作系统、python版本等信息提供,再次提问。

祝学习愉快~

0

MaxLu

提问者

2020-05-31

http://img.mukewang.com/climg/5ed393dc09e4556313810760.jpg

http://img.mukewang.com/climg/5ed393dc09719b8214100847.jpg


0

好帮手慕笑蓉

2020-05-31

同学,你好。老师这边测试同学得代码是没有报错的,请同学将操作步骤截图到问答区,方便老师快速定位问题产生的原因。

祝学习愉快~


0

0 学习 · 8160 问题

查看课程