【问题标题】:Multiprocessing with Python and Arguements使用 Python 和参数进行多处理
【发布时间】:2025-12-01 20:50:01
【问题描述】:

与我的上一篇文章有​​关(不知何故被标记并关闭), 我编写了一些代码来为我的 python TCP 侦听器的命令处理程序创建一个线程。基本上发生的是我发送了一些数据,然后它进入了 TCP 连接器。然后 TCP 连接器创建另一个进程并将通过该进程接收到的数据发送到命令侦听器中的函数。我不知道发生了什么事。请帮忙!

            import socket
    import sys
    import errno
    from multiprocessing import Process, Queue  # @UnresolvedImport
    import CommandHandler


    class tcpconnection:
        def tcp(self):
            data = ''
            q = Queue()
            p = Process(target=CommandHandler.CommandHandler.commands(), args=(self, data))
            #
            HOST = ''                 # Symbolic name meaning all available interfaces
            PORT = 9999              # Arbitrary non-privileged port
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((HOST, PORT))
            s.listen(1)
            conn, addr = s.accept()
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                p.start()
                p.join()
                if not data: break
                conn.send(data)
            conn.close()

说:

    p = Process(target=CommandHandler.CommandHandler.commands(), args=(self, data))
    TypeError: unbound method commands() must be called with CommandHandler instance as first argument (got nothing instead)

【问题讨论】:

    标签: python multithreading networking tcp multiprocessing


    【解决方案1】:

    target=CommandHandler.CommandHandler.commands()target 参数设置为commands 方法的调用结果。您可能打算使用该方法作为目标,因此您应该使用:

    p = Process(target=CommandHandler.CommandHandler.commands, args=(self, data))
    

    该错误还告诉您您正在尝试在类上调用未绑定的方法,但您需要一个对象来调用它,可能是:

    p = Process(target=CommandHandler.CommandHandler().commands, args=(self, data))
    

    但这不是你唯一的问题:

    while True:
        data = conn.recv(1024)
        p.start()
        p.join()
    

    第一次调用后,此循环将失败,因为您无法重新启动已启动的进程。

    【讨论】:

    • 但是如何创建一个新进程或关闭旧进程?
    • 每次都需要创建一个新的流程实例。你真的想为每个收到的数据包启动一个新进程吗?通常你会对每个接受的连接都这样做......
    • mata ,我如何仍将字符串传输到其他进程?使用一个过程?谢谢
    • 通常你会使用队列或其他ipc机制在进程之间交换数据(检查docs),或managers...