如何在python中序列化httplib SSL连接对象?

问题描述 投票:0回答:1

我试图通过zmq套接字发送httplib连接对象,但我得到以下错误TypeError: can't pickle _ssl._SSLSocket objects

现在我认为情况就是这样,因为我现在只是在试验,但有没有人知道一个包装或序列化SSL对象的方法,以便我可以通过套接字将它发送到其他线程?

一个用例示例:

#Script 1
import zmq
ctx = zmq.Context()
GLOBAL_SOCKET=ctx.socket(zmq.PUB)
GLOBAL_SOCKET.bind('tcp://127.0.0.1:2000')

conn = httplib.HTTPSConnection('site...')
GLOBAL_SOCKET.send_pyobj(conn)


#script 2
import zmq
ctx = zmq.Context()
GLOBAL_SOCKET=ctx.socket(zmq.SUB)
GLOBAL_SOCKET.connect('tcp://127.0.0.1:2000')
GLOBAL_SOCKET.setsockopt(zmq.SUBSCRIBE, '')

#recv SSL object in response hopefully
conn_ = GLOBAL_SOCKET.recv_pyobj()

#work with the connection object in another thread
conn_.request('GET', ....)
conn_.request.getresponse()

欢迎任何帮助。

python python-2.7 object ssl httplib
1个回答
1
投票

使用multiprocessing.Queue的工作示例:

import httplib
import ssl
import copy_reg
from multiprocessing.reduction import rebuild_socket, reduce_socket
from multiprocessing import Queue
import os


def save_sslcontext(obj):
    return obj.__class__, (obj.protocol,)

copy_reg.pickle(ssl.SSLSocket, reduce_socket, rebuild_socket)
copy_reg.pickle(ssl.SSLContext, save_sslcontext)


def parent():
    conn = httplib.HTTPSConnection('www.baidu.com')
    conn.connect()
    queue.put(conn)
    os.wait()


def child():
    conn = queue.get()
    conn.request('GET', '/')
    r = conn.getresponse()
    print r.status


queue = Queue()
if 0 == os.fork():
    child()
else:
    parent()
© www.soinside.com 2019 - 2024. All rights reserved.