关于线程的Python问题

时间:2011-02-11 13:11:38

标签: python multithreading asynchronous

我试图在两个函数上同时运行两个线程,如下面列出的那样:

import threading

def functionA():
    for i in range(5):
        print "Calling function A"

def functionB():
    for i in range(5):
        print "Calling function B"

t1 = threading.Thread(functionA())
t2 = threading.Thread(functionB())

t1.start()
t2.start()

结果:

调用功能A. 调用功能A. 调用功能A. 调用功能A. 调用功能A. 调用功能B. 调用功能B. 调用功能B. 调用功能B. 调用函数B

但不幸的是,经过多次尝试。我无法得到结果

期望的结果:

调用功能A. 调用功能B. 调用功能A. 调用功能B. 调用功能A. 调用功能B. 调用功能A. 调用功能B. 调用函数A

有人可以引导我,以便两个线程可以同时运行并产生所需的结果。提前谢谢。

4 个答案:

答案 0 :(得分:2)

调用函数并将结果传递给Thread构造函数而不是传递函数。此外,您必须使用target参数(而不是先出现的未使用的group)。只需使用Thread(target=functionA)Thread(target=functionB)即可。注意功能之后缺少parens。

请注意,您仍然不会在CPython中获得多线程,但这是一个不同的问题。

答案 1 :(得分:1)

@delnan已经回答了如何正确使用Thread,所以我将专注于你想要的输出。

您很可能无法获得所需的输出。线程执行的时间不能保证,特别是在Python中。操作系统调度可以影响每个线程何时运行。当你运行这样的两个线程时,你实际上是在说“这两件工作不依赖于彼此的顺序而且可以同时运行”。

你可以得到这样的输出:

 a,a,b,b,a,a,b,b,a,b

或者:

 a,b,b,b,b,b,a,a,a,a

每次执行程序时都会改变。不要依赖线程执行的顺序!

Python中的线程是一种危险的野兽。没有两个线程在Python中同时运行。阅读Global Interpret Lock了解更多信息。

答案 2 :(得分:0)

您正在编写一个新线程,操作系统负责线程如何使用处理器。这就是为什么排序不规律的原因。您应该使用另一个变量来定义哪个函数已经转动。但还是个坏主意。

答案 3 :(得分:0)

如果发布python 3.2会很好,因为查看下面的链接,内置的库可以帮助我实现目标。

http://docs.python.org/dev/library/concurrent.futures.html

但是,他们会考虑其他有用的成员提供的替代方案。感谢您再次提供的帮助。