在类的方法和 websocket 中运行多进程时出现 SSL pickle 错误



我正在创建一个用于建立websocket连接的phyton对象。根据我收到的消息,我希望使用multiprocessing在子进程上运行类的方法。然而,我得到了错误cannot pickle 'SSLSocket' object。为什么会这样呢?

下面的代码重现了这个错误。

import websocket
import json
from multiprocessing import Process

def on_close(ws, close_status_code, close_msg):
print('closed')

def on_error(ws, error):
print(error)

class ObClient():
def __init__(self):
self.ws = None
def on_open(self, ws):
subscribe_message = {"method": "SUBSCRIBE",
"params": 'btcusdt@depth5@1000ms',
"id": 1}
ws.send(json.dumps(subscribe_message))
def func(self):
print('hello')

def on_message(self, ws, message):
process = Process(target=self.func)
process.start()
process.join()
def connect(self):
self.ws = websocket.WebSocketApp('wss://stream.binance.com:443/stream', on_close=on_close, on_error=on_error,
on_open=self.on_open, on_message=self.on_message)
self.ws.run_forever()
if __name__ == '__main__':
client = ObClient()
client.connect()

为了创建进程,Python pickle进程使用的任何对象。在您的例子中,目标函数是self.func,ObClient的一个成员函数。成员函数可以访问对象的所有变量,其中一个是self.ws,它是WebSocket的一个实例。因此,Python尝试pickle WebSocket,它使用操作系统资源,因此无法pickle。这就是为什么你得到一个错误。

解决这个问题的一种方法是将func移动到不同的类或使其成为一个独立的函数。这样就不会拖进ObClient的所有成员变量。

最新更新