self._semlock = _multiprocessing.SemLock._rebuild(*state) FileNotFoundError

在Mac中运行python多进程程序出现如下问题(multiprocessing):

...
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
...
 self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory

运行一下代码导致:

from multiprocessing import Process, Queue

def download_data(q):
    data = [1,2,3]
    for i in data:
        q.put(i)    # 数据入队列


def handle_data(q):
    while True:
        num = q.get()  # 出队列
        print(num)
        if q.empty():
            break

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=download_data, args=(q,))
    p2 = Process(target=handle_data, args=(q,))

    p1.start()
    p2.start()

错误原因:
Python创建的子线程执行的内容, 和启动该进程的方式有关. 而不同的操作系统,启动进程的方式不同, 大致分为以下3种:

  1. spawn: 使用此方式启动进程, 只会执行和target参数或者run()方法相关的代码. Windows平台只能使用此方法. 此方式启动进程的效率最低.
  2. fork: 使用此方式启动的进程, 基本等同于主进程(复刻主进程, 主进程拥有的资源, 子进程都有). 所以, 该方式创建的子进程会从创建位置起, 和主进程一样执行程序中的代码. 此启动方式适用于Unix和Linux.
  3. forserver: 使用此方式, 程序将会启动一个服务器进程. 即当程序每次请求启动新进程时, 父进程都会连接到该服务器进程, 请求有服务器进程来创建新进程. 通过这种方式启动的进程不需要从父进程继承资源. 此方式使用与Unix,

**这里Mac电脑默认启动进程的方式是fork, 而Python默认的方式是spawn, 所有需要将python启动进程的方式做修改: **
这里提供两种方式:

  1. 添加 set_start_method(‘fork’)
  2. 使用 get_context() 来获取上下文对象。上下文对象与多处理模块具有相同的API,并允许在同一程序中使用多个启动方法. ctx = get_context(‘fork’) ; ctx.Process…
  3. 使用multiprocess.Queue()和multiprocess.Process()替换multiprocessing的.(这里略)
解决1: set_start_method(‘fork’)
from multiprocessing import Process, Queue, set_start_method

def download_data(q):
    data = [1,2,3]
    for i in data:
        q.put(i)    # 数据入队列


def handle_data(q):
    while True:
        num = q.get()  # 出队列
        print(num)
        if q.empty():
            break

if __name__ == '__main__':
    set_start_method('fork')
    q = Queue()
    p1 = Process(target=download_data, args=(q,))
    p2 = Process(target=handle_data, args=(q,))

    p1.start()
    p2.start()
解决2: 使用get_context(‘fork’)
from multiprocessing import Process, Queue, set_start_method, get_context

def download_data(q):
    data = [1,2,3]
    for i in data:
        q.put(i)    # 数据入队列


def handle_data(q):
    while True:
        num = q.get()  # 出队列
        print(num)
        if q.empty():
            break

if __name__ == '__main__':
    # set_start_method('fork')
    q = Queue()
    ctx = get_context('fork')
    p1 = ctx.Process(target=download_data, args=(q,))
    p2 = ctx.Process(target=handle_data, args=(q,))

    p1.start()
    p2.start()

问题解决了…

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tensorboard报错multiprocessing.SemLock._rebuild(*state) FileNotFoundError: [Errno 2] No such file or directory是由于在运行tensorboard时使用了多进程,而在多进程中调用了_semlock模块,但找不到相应的文件或目录引起的。这个问题在Mac系统上也会出现。解决这个问题的方法是在代码中加入以下操作:[3] 1. 在代码中导入必要的模块:from multiprocessing import Process, Queue, set_start_method, get_context 2. 设置启动方法为fork:set_start_method('fork') 通过这两个步骤,你可以解决tensorboard报错multiprocessing.SemLock._rebuild(*state) FileNotFoundError: [Errno 2] No such file or directory的问题,并确保在Mac系统中正常运行多进程程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [self._semlock = _multiprocessing.SemLock._rebuild(*state) FileNotFoundError: [Errno 2] No such file](https://blog.csdn.net/DL_Iris/article/details/123908700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [self._semlock = _multiprocessing.SemLock._rebuild(*state) FileNotFoundError](https://blog.csdn.net/weixin_45592364/article/details/126464756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值