【发布时间】:2016-12-06 03:06:00
【问题描述】:
我正在尝试通过使用装饰器来减少 SLOC。我有一个案例,我需要启动四个 TCP 服务器并将连接的客户端保存为全局变量。这是代码。
# The sockets we will be using
socket0_client = None
socket1_client = None
socket2_client = None
socket3_client = None
# Populate them
def save_client(global_client_var):
def decorator(func):
async def inner(client, verbose=False):
global_client_var = client
# Receive stuff
with client:
while True:
# Get data. If there is no data, quit
data = await loop.sock_recv(client, 10000)
if not data:
break
# respond to the data
await func(client, data)
return inner
return decorator
@save_client(socket0_client)
async def socket0_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket1_client)
async def socket1_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket2_client)
async def socket2_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
@save_client(socket3_client)
async def socket3_reply(client, data):
await loop.sock_sendall(client, b'Got:'+data)
loop.create_task(tcp_server.single_server(('', 60001), task=socket0_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60002), task=socket1_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60003), task=socket2_reply, verbose=True))
loop.create_task(tcp_server.single_server(('', 60004), task=socket3_reply, verbose=True))
有一个我没有代码的函数。它是 single_server 函数。它绑定到给定地址的服务器,等待连接,然后在新连接的客户端上调用任务。
我遇到的问题是,虽然客户端填充在内部函数中,并且明确设置为 global_client_var,但从未设置全局套接字。他们仍然没有。
这里发生了什么?如何设置这些全局变量?
【问题讨论】:
-
为什么不在函数
socket0_reply中将socket0_client声明为全局,然后将它们设置为客户端? -
因为在从套接字接收到数据之前不会调用该代码。即使在收到数据之前,我也希望能够在其他地方使用套接字。
标签: python sockets scope python-asyncio python-decorators