2017-04-17 56 views
1

我试图做一个独立的循环,因为第二个使用raw_input()等待输入。要做到这一点,我发现做这件事的最好方法是多线程,我试图弄清楚它是如何工作的。我写了这个:多线程简介 - 一次运行2个循环

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() 

I`d期望看到什么是1S和2S的一排被印刷到外壳,但它是所有1S的只是一排。如何获得第二个线程?

编辑:行,所以我提出:

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的循环不应该停止。

+0

你的第二个代码适合我......你有什么? – Aaron

+1

您的线程正在争夺非同步资源,特别是控制台。如果我将loopA的循环设置为sleep 10,则可以输入“12345”并等待打印,然后继续输入“67890”,raw_input获得“67890”。 print语句强制控制台丢弃所有内容并从raw_input开始。 –

+0

第二个代码:我希望每秒打印1个,即使我正在写入输入,也没有按回车。输入会停止进程并等待,直到我返回时,我希望它不会与循环进行混淆。 –

回答

0

我不确定你在用你的第二个例子来查找你的输入,因为它看起来像我期望的那样工作。至于你的第一个例子,你用Thread.run()而不是Thread.start()run属性是对实际可调用的引用(在这种情况下为target),并为子类化提供了线程类。调用run()不会启动一个新的执行线程,而只是在主线程中调用目标函数。这就是为什么你的第二个线程从未在第一个例子中启动的原因。从run更改为start解决了此问题。

+0

第二个问题可能依赖于操作系统 –

+0

@KennyOstrom不在[当前版本](https://github.com/python-git/python/blob/master/Lib/threading.py#L474)至少......'运行“是一个简单的”调用目标“功能,并提供一点保护以避免自我引用。 – Aaron

+0

帮助,仍然还没有在我的目标寿。它做了我想要的,但是(请参阅原始文章中的评论),一旦调用raw_input()函数,它会停下来,直到我写入内容为止。 –