>我正在很好地处理套接字客户端,实际上是 2 个客户端,一个发送消息,另一个接收消息。有两个套接字服务器,一个侦听命令,另一个提供响应。 我正在尝试编写一个双客户端,它允许我发送消息,并将启动另一个进程以从响应服务器接收消息。它们并不总是同步的。我创建了这个小类,我希望它启动一个进程来侦听响应,但是当我运行它时,我遇到了这个错误:
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle module objects
小程序如下:
import socket
import logging
import time
from multiprocessing import Pool, Process, Manager, Pipe
import traceback
import re
class Geisy3:
received_messages = []
dbg_process = None
def __init__(self):
print('hello')
def connect(self, ip, port):
s = socket.socket()
logging.basicConfig(filename="geisy-3.log", level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s')
logging.info('Icci debug IP: %s, cmd port: %s', ip, port)
s.connect((ip, port))
logging.info('Socket connection established on %s:%s', ip, port)
with Manager() as manager:
self.received_messages = manager.list()
self.dbg_process = Process(target=self.socket_receiver, args=(self, s, self.received_messages, logging))
self.dbg_process.start()
self.dbg_process.join()
print('Debug process started')
def socket_receiver(self, soc, received_messages, logging):
try:
while 1:
logging.debug('Socket listener is awaiting message')
raw_response = soc.recv(256)
logging.debug('RAW Msg recv [%s]: %s', 20001, raw_response)
except Exception as e:
logging.FATAL('Exception %s:', e)
logging.FATAL('Debug listner exception occured %s', traceback.format_exc())
if __name__ == '__main__':
i = Geisy3()
i.connect('98.1.24.40', 20001)
time.sleep(500)
我不知道为什么会出现此错误。是因为窗口生成而不是分叉吗?
我实际上可以在类中有一个方法启动,加入然后有效地杀死进程吗?
有 4 个部分(我只控制 2 个部分(。我在尝试设置侦听器时得到了这个。一旦我在课堂外使用它,这段代码就可以工作。我很难弄清楚应该如何在类中实现这一点。我们实际上可以完全忽略来自末端的发送器(它工作正常,它是另一个类(。上述侦听器连接到的服务器发送检测信号消息,因此我应该能够运行进程并让它打印这些消息。
就像我说的作为没有类的独立脚本,它工作得很好,问题是我需要将其嵌入到另一个程序中,因此我想将其放在一个类中,以便从另一个程序获得更多控制。