【问题标题】:Multithreading introduction - running 2 loops at one time多线程介绍——一次运行2个循环
【发布时间】:2017-09-13 02:22:02
【问题描述】:

我正在尝试制作一个相互独立的循环,因为第二个循环正在等待使用 raw_input() 的输入。为此,我发现最好的方法是多线程,我正试图弄清楚它是如何工作的。我是这样写的:

from threading import Thread
import time
def loopA():
    while True:
        print "1"
        time.sleep(1)
def loopB():
    while True:
        print "2"
        time.sleep(1)
threadA = Thread(target = loopA)
threadB = Thread(target = loopB)
threadA.run()
threadB.run()

threadA.join()
threadB.join()

我希望看到的是一行 1 和 2 被打印到 shell 中,但它所做的只是一行 1。如何让第二个线程也参与进来?

编辑:好的,所以我已经搬家了:

from threading import Thread
import time
def loopA():
    while True:
        print "1"
        time.sleep(1)
if __name__ == "__main__":
    Thread(target = loopA).start()
    while True:
        n = raw_input("enter here:")
        print n

我现在想要的是 1 被一遍又一遍地打印,每当我写东西并按回车时,它应该会被打印出来,但 1 的循环不应该停止。

【问题讨论】:

  • 你的第二个代码对我有用......你得到了什么?
  • 您的线程正在竞争非同步资源,特别是控制台。如果我将 loopA 的循环设置为睡眠 10,我可以输入“12345”并等待打印,然后继续输入“67890”,raw_input 得到“67890”。 print 语句强制控制台丢弃所有内容并从 raw_input 重新开始。
  • 第二个代码:我希望每秒打印 1,即使我正在编写输入并且还没有按回车键。输入停止该过程并等到我点击返回,我希望它根本不与循环发生冲突。
  • 您是在终端中运行还是在使用 ide?肯尼描述的行为是应该发生的事情
  • 我同时使用 IDLE 和 shell,以及 Geany IDE。是的,Kenny 写的是对的,但我希望 loopA 随时打印,无论我当前是否正在输入输入。

标签: python multithreading python-2.7


【解决方案1】:

我不确定您在轮询输入的第二个示例中正在寻找什么,因为它似乎按我的预期工作。至于您的第一个示例,您使用了Thread.run() 而不是Thread.start()run 属性是对实际可调用对象(在本例中为 target)的引用,并提供给子类化以创建线程类。调用run() 不会启动新的执行线程,而只是调用主线程中的目标函数。这就是为什么在第一个示例中从未启动您的第二个线程的原因。从run 更改为start 可以解决此问题。

【讨论】:

  • 第二个问题可能与操作系统有关
  • @KennyOstrom 至少不在current release 中。run 是一个非常简单的“调用目标”函数,带有一点保护以避免自引用。
  • 这有帮助,但还没有达到我的目标。它做了我想要的,但是(请参阅我原始帖子中的 cmets),一旦调用 raw_input() 函数,它就会停止,直到我向其中写入一些内容。
  • 通过“第二个问题”,我指的是您在第一行中提到的同一件事,在那里您说“我不确定您在第二个示例中寻找什么输入”。
  • @KennyOstrom gotcha.. 是的,文件流缓冲可能是这里的主要驱动因素,我对此并不熟悉。
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多