【问题标题】:Take multiple inputs simultaneously from console python从控制台python同时获取多个输入
【发布时间】:2019-11-26 13:14:12
【问题描述】:

我正在研究电梯计划。当有人按下按钮时,电梯应该停止。

例如:如果电梯到了 11 楼,并且在有人按了 3 楼之间,那么它应该停止。

我尝试了使用多线程的程序,它的工作方式如下:

    while(True):
        t1= threading.Thread(target=get_input, name='t1')
        t2= threading.Thread(target=traverse, name='t2')
        t1.start()
        time.sleep(5)
        traverse()
        t2.start()

遍历功能将电梯移动到所需楼层。

简而言之,我实现的想法是 1 个线程接受输入,其他线程一次移动电梯。但是有没有其他方法可以代替线程(尽管这个解决方案有效)?

【问题讨论】:

  • 不是一个真正有效的方法,你可以重写它而不添加Threading函数。
  • @SalmanFarsi 我不知道什么时候从控制台获取输入。因为我不想一次接受所有输入。
  • 我不这么认为还有另一个像线程一样简单的库。!
  • 分割成两个代码区,一个区会设置一个监听socket,用于电梯呼叫,另一个区会调用已知端口的电梯。将有某种 TCP 握手来编组数据。

标签: python python-3.x multithreading python-2.7 python-multithreading


【解决方案1】:

在某些情况下,您可以在不使用线程的情况下重写它,但是您没有提到如何获得用户输入。你是从套接字获取的吗?或来自其他自定义协议等。所以在这里我提供一些我认为可以工作的场景和解决方案。

  1. 来自 Socket:只需制作其他 get_input 并遍历协程,最后使用 asyncio.gather。
  2. 从控制台:然后我们可以使用 asyncio 替代品进行常见操作,例如输入等,例如检查这个库 https://github.com/vxgmichel/aioconsole。并使用上面提到的 asyncio.gather/wait。

如果上述 2 个解决方案不适合您的用例,那么如果 traverse 是非阻塞的并且没有做太多工作,那么您可以创建一个状态机。如果 traverse 完成的工作量并不大,那么这个解决方案就不合适了,因为它可能会长时间阻塞单线程中的程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多