Python Twisted中的异步操作被键盘I/O阻塞
我开始使用Twisted进行异步编程,我遇到了一个简单的问题,我不知道如何解决这个问题。下面提供了问题的快速分解:Python Twisted中的异步操作被键盘I/O阻塞,python,asynchronous,udp,twisted,Python,Asynchronous,Udp,Twisted,我开始使用Twisted进行异步编程,我遇到了一个简单的问题,我不知道如何解决这个问题。下面提供了问题的快速分解: 服务器1是一个UDP服务器,监听主机的给定端口 服务器1公开了一个用于(比如)数据处理的操作API 服务器2也是一个UDP服务器,监听主机的不同端口 服务器2正在运行while循环,从用户那里获取I/O以选择将发送到服务器1的请求。例如,一个计算数字阶乘的请求 从用户处获得输入后,服务器2对服务器1进行异步调用。此调用有一个关联的回调来处理将从服务器1获得的响应 在进行调用时,循
- 服务器1是一个UDP服务器,监听主机的给定端口
- 服务器1公开了一个用于(比如)数据处理的操作API
- 服务器2也是一个UDP服务器,监听主机的不同端口
- 服务器2正在运行while循环,从用户那里获取I/O以选择将发送到服务器1的请求。例如,一个计算数字阶乘的请求
- 从用户处获得输入后,服务器2对服务器1进行异步调用。此调用有一个关联的回调来处理将从服务器1获得的响应
- 在进行调用时,循环到达调用,并再次向用户请求I/O。我可以在日志中看到服务器1处理请求并发送响应,但是服务器2中的回调从未执行过一旦我从while循环中断,回调就会执行
我猜你对扭曲有误解。在Twisted中,reactor运行一个主命令循环来处理所有事件。您自己实现了两个永不终止的循环。这样一来,反应器回路就再也无法到达,扭曲也无法工作。您需要的是使用延迟对象和回调。但我知道Twisted很复杂,涉及到很多不同于“正常”编程的思考,这使得这个主题太复杂,无法在这里处理。也许你应该做手指教程。它一步一步地教你基本概念:如果你发布你的代码,我们可能会提供帮助。其中有很多,我将尝试将其抽象为一个简单的例子@KlausD@KlausD。我添加了服务器2正在执行的代码。我觉得这一定是一个愚蠢的错误,谢谢你的帮助。我对Twisted或异步处理肯定不是很有经验,但我认为这是一个我完全看不到的简单问题。有没有一种方法可以执行异步调用,从而阻止执行?再次感谢!阻止执行与异步调用几乎相反。如果在Twisted中进行阻塞调用,它将阻塞整个反应堆。
# Not including the Twisted code
addr = ("Server 1's IP", "Server 1's Port Number")
# Server class implements the functions to make calls and callbacks that act on responses from Server 1
chordServer = Server(2, "This server's IP", "This Server's port")
server = internet.UDPServer(8468, chordServer.protocol)
server.setServiceParent(application)
def controlLoop(q):
command = None
while 1:
command = input("Enter command: \n 1) join network \n 2) leave network \n 3) store key \n 4) fetch key\n 5) exit\n")
if command == 1:
print ">>> Executing Join Network Comand!"
q.put(command)
elif command == 2:
print ">>> Executing Leave Network Comand!"
q.put(command)
elif command == 3:
continue
elif command == 4:
continue
elif command == 5:
q.put(command)
#time.sleep(1)
def main():
cmd_queue = Queue.Queue()
dj = threading.Thread(target=controlLoop, args=(cmd_queue,))
dj.start()
while 1:
cmd = cmd_queue.get()
if cmd == 5:
break # Only after breaking does the callback associated with the calls below execute
elif cmd == 1:
chordServer.joinNetwork(addr) # Async call to Server 1
elif cmd == 2:
chordServer.leaveNetwork() # Another possible Async call to Server 1
task.deferLater(reactor, 5, main)