python多线程执行同一个函数_Python线程:同时运行2个不同的函数

本文探讨了在Python中如何使用多线程同时运行一个函数和获取用户输入,通过示例代码展示了线程间共享变量和线程安全问题,并提供了线程异常处理的解决方案。
摘要由CSDN通过智能技术生成

我有一个函数foo,只有在满足条件后才会停止.当foo正在运行时,我需要一直询问用户输入(不断询问用户输入).我希望它们分开运行而不会相互干扰.

在下面的示例中,foo继续打印’Hello’并且getUserInput继续查找用户输入.即使我没有为用户输入输入任何内容,我也希望foo继续打印你好.只要用户没有输入字母’e’,它就会一直询问输入.我有以下尝试:

import threadingfrom time import sleepclass test: def __init__(self): self.running = True def foo(self): while(self.running): print "Hello\n" sleep(2) def getUserInput(self): x = "" while(x != "e"): x = raw_input("Enter value: ") self.running = False def go(self): th1 = threading.Thread(target=self.foo) th2 = threading.Thread(target=self.getUserInput) th1.start() th2.start()t = test()t.go()

我的代码打印出第一个问候语并要求输入,但之后没有任何内容.我究竟做错了什么?感谢您的帮助.

解决方法:

更新:开启者在IDLE上的Windows上运行他的代码.关于I / O,它的行为与shell或Windows命令行不同.他的代码适用于Windows命令行.

原则上,您的代码适合我.我正在运行Python 2.6.5.

这里有几条评论:

1)在你的情况下,只有两个线程是好的:主线程和另一个线程.但是,它也可以使用三个.只是你的主线程只是等待其他线程完成.

2)你应该明确地加入()你产生的所有线程.您在终止它之前在主线程中执行此操作.记录你产生的线程(例如在列表线程中),然后在程序结束时加入它们(例如,对于线程中的t:t.join()).

3)您在线程之间共享变量self.running.在这种情况下它很好,因为一个线程只读取它而另一个只写它.通常,您需要非常小心共享变量并在更改之前获取锁定.

4)您应该在主线程中捕获KeyboardInterrupt异常,并找到一种方法与您的其他线程进行通信以终止:)

5)使用小写方法名称,因此不是getUserInput,而是调用get_user_input.使用大写的类名并从object继承:class Test(object):

这是一个运行的例子:

import threadingfrom time import sleepdef main(): t = Test() t.go() try: join_threads(t.threads) except KeyboardInterrupt: print "\nKeyboardInterrupt catched." print "Terminate main thread." print "If only daemonic threads are left, terminate whole program."class Test(object): def __init__(self): self.running = True self.threads = [] def foo(self): while(self.running): print "\nHello\n" sleep(2) def get_user_input(self): while True: x = raw_input("Enter "e" for exit: ") if x.lower() == "e": self.running = False break def go(self): t1 = threading.Thread(target=self.foo) t2 = threading.Thread(target=self.get_user_input) # Make threads daemonic, i.e. terminate them when main thread # terminates. From: https://stackoverflow.com/a/3788243/145400 t1.daemon = True t2.daemon = True t1.start() t2.start() self.threads.append(t1) self.threads.append(t2)def join_threads(threads): """ Join threads in interruptable fashion. From https://stackoverflow.com/a/9790882/145400 """ for t in threads: while t.isAlive(): t.join(5)if __name__ == "__main__": main()

键入e或E时,程序会在短暂延迟后结束(按照您的意图).按ctrl c时,它会立即终止.制作一个使用线程响应异常的程序比预期的要复杂一些.我在上面的源代码中包含了重要的参考资料.

这是它在运行时的样子:

$python supertest.pyHelloEnter "e" for exit: HelloHelloHelloe$来源:http://www.icode9.com/content-1-216201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值