我无法将SSLSockets
与multiprocessing.Process.start()
一起使用。我想在SSL套接字上每次收到请求时派生新进程。我问了问题,并亲自here回答了问题。多处理代码如下:
process = mup.Process(target=worker_ssl, args=(data_socket, client_address))
process.daemon = True
process.start()
其中data_socket
是SSLSocket
对象。我遇到以下错误:
17 ForkingPickler(file, protocol).dump(obj)
18 File "D:\Programs\python\python-3.6.6-amd64\lib\socket.py", line 185, in __getstate__
19 raise TypeError("Cannot serialize socket object")
20 TypeError: Cannot serialize socket object
似乎SSLSockets
无法序列化。我最终使用了os.fork
。
但是,现在我在python ssl模块页面上遇到了following paragraph:
如果将此模块用作多处理应用程序的一部分(使用, 例如
multiprocessing
或concurrent.futures
模块), 注意OpenSSL的内部随机数生成器不会 正确处理分支过程。应用程序必须更改PRNG
父进程的状态(如果他们将任何SSL功能与os.fork()
。RAND_add()
,RAND_bytes()
或RAND_pseudo_bytes()
就足够了。
它说明了multiprocessing
和os.fork()
两者。但我无法理解其中任何一个。我也发现这篇文章谈论的是相同的。它说我应该为每个进程提供新的SSL连接。但是我不知道该怎么做。我在os.fork()
上的代码运行正常。但是,如果我在同时使用multiprocessing
和os.fork
来实现ssl时缺少一些要考虑的问题,那么上面的内容将使我感到担忧。有人可以详细说明上一段的确切含义,以及应该如何(理想)使用multiprocessing
和os.fork
实现ssl吗?