gpt4 book ai didi

python - 如何在python中运行在该线程外的线程中调用的函数

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:49 24 4
gpt4 key购买 nike

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

考虑下面的例子

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 #线程比thread模块好从队列导入队列

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

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

最佳答案

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

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

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

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

关于python - 如何在python中运行在该线程外的线程中调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com