Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Twisted中的异步操作被键盘I/O阻塞_Python_Asynchronous_Udp_Twisted - Fatal编程技术网

Python Twisted中的异步操作被键盘I/O阻塞

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获得的响应 在进行调用时,循

我开始使用Twisted进行异步编程,我遇到了一个简单的问题,我不知道如何解决这个问题。下面提供了问题的快速分解:

  • 服务器1是一个UDP服务器,监听主机的给定端口
  • 服务器1公开了一个用于(比如)数据处理的操作API
  • 服务器2也是一个UDP服务器,监听主机的不同端口
  • 服务器2正在运行while循环,从用户那里获取I/O以选择将发送到服务器1的请求。例如,一个计算数字阶乘的请求
  • 从用户处获得输入后,服务器2对服务器1进行异步调用。此调用有一个关联的回调来处理将从服务器1获得的响应
  • 在进行调用时,循环到达调用,并再次向用户请求I/O。我可以在日志中看到服务器1处理请求并发送响应,但是服务器2中的回调从未执行过一旦我从while循环中断,回调就会执行
我试着在一个单独的线程中运行I/O代码,但我无法找出如何使操作无阻塞。有人对我如何解决这个问题有什么建议吗

谢谢你抽出时间

编辑1。以下是服务器2正在执行的代码(I/O循环发出请求的代码)


我猜你对扭曲有误解。在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)