无法让多处理功能与我的Python类实例一起使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法让多处理功能与我的Python类实例一起使用相关的知识,希望对你有一定的参考价值。

基本上,我想为同一对象创建几个实例,并同时分别执行它们。示例代码:

if __name__ == '__main__':
            load_dotenv()

            query = "SELECT username, password FROM students"
            cursor.execute(query)
            records = cursor.fetchall()

            print("Total number of accounts botting up ", cursor.rowcount)

            object_list = list()
            for username, password in records:
                obj = Student(username, password)
                object_list.append(obj)

            instance_list = list()
            for x in object_list:
                p = multiprocessing.Process(target=x.login)
                p.start()
                instace_list.append(p)

            for x in instance_list:
                x.join()

ps:login()是类内部的方法。

到目前为止,我已经让他们全部创建了该类的实例,但是还无法为每个实例执行login方法。

我在终端中收到此错误:

 (student-bot) C:pythonstudent-bot>Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:usersalbertoappdatalocalprogramspythonpython37libmultiprocessingspawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "c:usersalbertoappdatalocalprogramspythonpython37libmultiprocessing
eduction.py", line 87, in steal_handle
    _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE)
PermissionError: [WinError 5] Acceso denegado
[13852:1860:0427/193022.541:ERROR:device_event_log_impl.cc(162)] [19:30:22.541] Bluetooth: bluetooth_adapter_winrt.cc:1055 Getting Default Adapter failed.

答案

您可能想要target=x.login,而不是x.login()。否则,您将调用target.login()返回的任何内容,甚至可能无法调用。一个“正在执行”的过程实际上可能只是主线程,并且是您已经编码x.login()的结果,但实际上所有子过程都没有工作。显示错误消息会很有帮助。还要确保上面的代码在以下列开头的块内:

if __name__ == '__main__':

例如:

import multiprocessing

class Foo:
    def bar(self, i):
        print(i, flush=True)

f = Foo()

if __name__ == '__main__':
    instace_list = list()
    for i in range(3):
        p = multiprocessing.Process(target=f.bar, args=(i,))
        p.start()
        instace_list.append(p)

    for x in instace_list:
        x.join()

打印:

0
1
2

以上是关于无法让多处理功能与我的Python类实例一起使用的主要内容,如果未能解决你的问题,请参考以下文章

你如何让多处理池不启动新进程但也不终止当前正在运行的进程?

Express-Socket.IO 应用程序无法与我的 Azure WebApp 一起使用

如何将 OBIEE 的 FORECAST 功能与我的日历维度一起使用?

异常处理

无法让多文件内核模块工作

无法与我的 EC2 实例建立 Internet 连接 [使用 terraform 部署,并为 ACL、安全组、Internet GW 打开了 80 个 http 端口]