【发布时间】:2014-11-13 22:45:35
【问题描述】:
使用下面的代码,我似乎可以很容易地使用 multiprocessing.reduction 在子进程中重建套接字..
import socket,os
import multiprocessing
from multiprocessing.reduction import reduce_handle, rebuild_handle
client = socket.socket()
client.connect(('google.com', 80))
rd = reduce_handle(client.fileno())
print "Parent: %s" % (os.getpid())
def test(x):
print "Child: %s" % (os.getpid())
build = rebuild_handle(x)
rc = socket.fromfd(build, socket.AF_INET, socket.SOCK_STREAM)
rc.send('GET / HTTP/1.1\n\n')
print rc.recv(1024)
p = multiprocessing.Process(target=test, args=(rd,))
p.start()
p.join()
我有一个同时运行多场比赛的 Twisted 游戏服务器。这些比赛可能包含几个玩家,每个玩家都有一个协议实例。我想做的是将匹配拆分到 Twisted 子进程池中,并让池处理他们自己处理的匹配的客户端。似乎读取/写入客户端的数据并将该数据传入和传出子进程将是不必要的开销。
协议保证是 TCP 实例,所以我相信我可以(如上面的代码)像这样减少套接字:
rd = reduce_handle(myclient.transport.fileno())
通过查看 Twisted 源将数据传递给子进程后,我现在似乎可以像这样在子进程中重建它:
import socket
from twisted.internet import reactor, tcp
from multiprocessing.reduction import reduce_handle, rebuild_handle
handle = rebuild_handle(rd)
sock = socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM)
protocol = MyProtocol(...)
transport = tcp.Connection(sock, protocol, reactor=reactor)
protocol.transport = transport
我只是想试试这个,但鉴于我对 Twisted 的内部结构并不十分熟悉,即使这可行,我也不知道这可能会产生什么影响。
谁能告诉我这看起来是否正确以及是否可行?出于某种原因,这是不可取的吗(我从未在 Twisted 文档或帖子中看到过它,尽管它看起来很相关)?如果这行得通,我应该注意什么?
提前致谢。
【问题讨论】:
标签: python sockets multiprocessing twisted