3

我想知道在主线程中运行函数的可能性,而调用函数在另一个线程中。

考虑下面的例子

from thread import start_new_thread

def add(num1,num2):

    res = num1 + num2
    display(res)

def display(ans):
    print ans

thrd = start_new_thread(add,(2,5))

在这里,我正在调用add()一个新线程。依次调用display()即显示也在同一个线程中运行。

我想知道如何display()在该线程之外运行。

根据以下答案的新代码

如果我试图接受用户的输入并打印结果。它只要求输入一次但不重复......

from threading import Thread # threading 比 thread 模块好 from Queue import Queue

q = Queue() # 使用队列将消息从工作线程传递到主线程

def add():
    num1=int(raw_input('Enter 1st num : '))
    num2=int(raw_input('Enter 2nd num : '))
    res = num1 + num2
    # send the function 'display', a tuple of arguments (res,)
    # and an empty dict of keyword arguments
    q.put((display, (res,), {}))

def display(ans):
    print ('Sum of both two num is : %d ' % ans)

thrd = Thread(target=add)
thrd.start()

while True:  # a lightweight "event loop"
#    ans = q.get()
#    display(ans)
#    q.task_done()
    f, args, kwargs = q.get()
    f(*args, **kwargs)
    q.task_done()

当我运行代码时,结果如下

当前结果

Enter 1st num : 5
Enter 2nd num : 6
Sum of both two num is : 11 

要求的结果

Enter 1st num : 5
Enter 2nd num : 6
Sum of both two num is : 11 

Enter 1st num : 8
Enter 2nd num : 2
Sum of both two num is : 10

Enter 1st num : 15
Enter 2nd num : 3
Sum of both two num is : 18

我需要它在每次打印结果后要求输入,如下所示

4

2 回答 2

11

听起来您希望所有调用都display发生在主线程上。像这个简单的例子,使用 aQueue向主线程发送消息,应该可以工作:

from threading import Thread  # threading is better than the thread module
from Queue import Queue

q = Queue()  # use a queue to pass messages from the worker thread to the main thread

def add(num1,num2):
    res = num1 + num2
    q.put(res)  # send the answer to the main thread's queue

def display(ans):
    print ans

thrd = Thread(target=add, args=(2,5))
thrd.start()

while True:  # a lightweight "event loop"
    ans = q.get()
    display(ans)
    q.task_done()

这种轻量级“消息传递框架”的典型概括是对您的工作线程进行编程,以将任意函数和参数放在q. 这使您可以使主线程更笨拙。处理 q 的代码将如下所示:

def add(num1,num2):
    res = num1 + num2
    # send the function 'display', a tuple of arguments (res,)
    # and an empty dict of keyword arguments
    q.put((display, (res,), {}))

# snip

while True:
    # now the main thread doesn't care what function it's executing.
    # previously it assumed it was sending the message to display().
    f, args, kwargs = q.get()
    f(*args, **kwargs)
    q.task_done()

从这里您可以了解如何设计一个健壮且解耦的多线程应用程序。您为每个工作线程对象配备一个 input Queue,并且一个全局中介线程负责在线程之间混洗消息。

请注意,Queue基于 - 的多线程方法假定没有线程共享任何全局对象。如果是这样,您还需要确保所有共享对象都有关联的锁(请参阅文档threading。当然,这很容易出现Queue基于 的方法试图避免的困难同步错误。这个故事的寓意,尽管看起来很辛苦,但要将共享状态保持在最低限度。

于 2012-12-07T13:23:39.587 回答
0

好像你想阻止会合​​或障碍

于 2014-05-09T08:57:23.947 回答