【问题标题】:Python multiprocessing Process cant pickle pyttsx3.init()Python多处理进程无法腌制pyttsx3.init()
【发布时间】:2021-05-01 20:28:36
【问题描述】:

我目前正在开发具有多处理和 pyttsx3 的 TTS 应用程序。如果我尝试启动一个进程并将 pyttsx3.init("sapi5") 对象作为参数传递,以便使用它在目标函数中说话,它会因为酸洗和 PermissionError 而返回 TypeError。 这是一个复制示例:

import pyttsx3

def dummy(engine):
    engine.say("test")
    engine.runAndWait()

if __name__ == "__main__":
    multiprocessing.Process(target=dummy, args=(pyttsx3.init("sapi5"),)).start()

以及产生的错误:

D:/Python3.9.2_x64/python.exe "d:/VSCode Projects/TTS/test2.py"
Traceback (most recent call last):
  File "d:\VSCode Projects\TTS\test2.py", line 9, in <module>
    multiprocessing.Process(target=dummy, args=(pyttsx3.init("sapi5"),)).start()
  File "D:\Python3.9.2_x64\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "D:\Python3.9.2_x64\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "D:\Python3.9.2_x64\lib\multiprocessing\context.py", line 327, in _Popen
    return Popen(process_obj)
  File "D:\Python3.9.2_x64\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
    reduction.dump(process_obj, to_child)
  File "D:\Python3.9.2_x64\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'module' object

D:\VSCode Projects>Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "D:\Python3.9.2_x64\lib\multiprocessing\spawn.py", line 107, in spawn_main
    new_handle = reduction.duplicate(pipe_handle,
  File "D:\Python3.9.2_x64\lib\multiprocessing\reduction.py", line 79, in duplicate
    return _winapi.DuplicateHandle(
PermissionError: [WinError 5] Zugriff verweigert

注意:“Zugriff verweigert”在英文中是“Access denied”

PS:这是我在这里的第一个问题,请随时提供反馈

【问题讨论】:

    标签: python python-3.x visual-studio-code multiprocessing pyttsx3


    【解决方案1】:

    “如果我尝试启动一个进程并将 pyttsx3.init("sapi5") 对象作为参数传递,以便使用它在目标函数中说话,它会因为酸洗而返回 TypeError” 正确,因为该对象不能被腌制。什么是酸洗?酸洗,粗略地说,是 Python 中数据的序列化。为什么我们需要酸洗进行多处理?因为 Python 有一个叫做全局解释器锁的东西,这意味着为了进行多处理,Python 需要使用自己的解释器生成新进程。为了与这些进程共享数据,必须对数据进行序列化。 这一切归结为,在您了解对象的酸洗之前,只需坚持仅将内置类型作为参数传递给多处理函数。不要尝试传递像 pyttsx3.init("sapi5") 这样复杂的东西,因为是的,它可能不会腌制。

    (我不知道权限是什么,但我会坚持回答问题的标题。如果仍然存在,请打开一个单独的问题)。

    【讨论】:

    • 感谢您的解释,因为直到现在我还不熟悉酸洗。我对我的第一个问题有一个新想法,这引发了这个问题。
    • 别管另一个也没用。
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2021-06-17
    • 2020-09-22
    • 2022-01-02
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多