如何将函数和参数放入Python队列中?

17 浏览
0 Comments

如何将函数和参数放入Python队列中?

我有一个Python程序有两个线程(我们称之为“源”和“目标”)。源线程有时会向目标线程发布带有一些参数的消息。然后目标线程选择一个消息,必须使用消息中保存的参数调用相应的函数。这个任务可以有多种解决方式。简单的方法是在目标线程的消息选择循环中放置一个大的“if...if..if”,根据接收到的消息类型和保存的参数调用函数。但是这将导致大量的代码(或大的查找表),并且添加新的消息/处理函数将需要在消息选择循环中编写额外代码。由于Python将函数视为一等对象并且具有元组,因此我想将函数和参数放在消息中,这样目标线程选择一个消息时,只需调用消息中保存的函数,而不需要知道它是什么函数。我可以为指定数量的参数编写函数的代码:\n代码:\nfrom Queue import *\nfrom thread import *\nfrom time import *\nq = Queue()\ndef HandleMsg( arg1, arg2 ) :\n print arg1, arg2\ndef HandleAnotherMsg( arg1, arg2, arg3 ) :\n print arg1, arg2, arg3\ndef DestinationThread( a ) :\n while True :\n (f, a, b) = q.get()\n f( a, b )\nstart_new_thread( DestinationThread, ( 0, ) )\nprint \"start\"\nsleep( 1 )\nq.put( (HandleMsg, 1, 2) )\nsleep( 1 )\nprint \"stop\"\n问题是:如何修改代码,以便我可以在队列中put()带有任意数量的参数的函数?例如HandleAnotherMsg()?使用q.put((HandleAnotherMsg, 1, 2, 3))会引发编译错误 🙁

0
0 Comments

问题的出现原因是想要将函数和参数放入Python队列中,但不清楚如何操作。

解决方法是使用Python的Queue模块来创建队列,并使用put()函数将函数和参数放入队列中。然后,创建一个线程来处理队列中的函数调用。在DestinationThread()函数中,使用get()函数从队列中取出函数和参数,并使用*args将参数传递给函数来执行。最后,在主程序中,使用put()函数将函数和参数放入队列中,并使用sleep()函数来模拟函数调用的间隔。当队列中的函数调用完成后,程序输出"stop"。

以下是整理后的文章:

使用Python的Queue模块可以将函数和参数放入队列中,并在需要的时候进行调用。下面的代码演示了如何将函数和参数放入Python队列中,并使用一个线程来处理队列中的函数调用。

from Queue import *
from thread import *
from time import *
# 创建队列
q = Queue()
# 定义处理函数
def HandleMsg(arg1, arg2):
    print arg1, arg2
def HandleAnotherMsg(arg1, arg2, arg3):
    print arg1, arg2, arg3
# 处理队列中的函数调用的线程
def DestinationThread():
    while True:
        # 从队列中取出函数和参数
        f, args = q.get()
        # 执行函数调用
        f(*args)
# 创建处理队列的线程
start_new_thread(DestinationThread, tuple())
# 主程序
print "start"
sleep(1)
# 将函数和参数放入队列中
q.put((HandleMsg, [1, 2]))
sleep(1)
q.put((HandleAnotherMsg, [1, 2, 3]))
sleep(1)
print "stop"

运行以上代码,将会输出以下结果:

start
1 2
1 2 3
stop

通过以上代码,我们可以看到函数和参数被成功地放入了队列中,并在DestinationThread()线程中被调用执行。这种方法可以方便地实现函数的异步调用,提高程序的效率和响应速度。

希望以上内容对你理解如何将函数和参数放入Python队列中有所帮助!

0
0 Comments

在Python中,可以使用队列(Queue)来实现线程之间的通信。一个常见的问题是如何将函数和参数放入Python队列中。下面的代码展示了一种方法,即将一个lambda表达式放入队列中:

q.put(lambda: HandleMsg(1,2))
q.put(lambda: HandleAnother(8, "hello", extra="foo"))

以上代码将两个lambda表达式放入队列q中。在目标线程中,通过获取队列中的元素并执行该元素,可以实现调用函数的效果:

def DestinationThread():
   while True:
      f = q.get()
      f()

这种方法可以正常工作,但需要注意避免意外结果的发生。如果想要更深入理解lambda中的闭包(closure),可以参考stackoverflow上的这个问题:stackoverflow.com/questions/28494089/…

0
0 Comments

问题的出现原因:

问题是关于如何将一个函数和参数放入Python队列中的。文章中提供了一个简单的解决方法,即创建一个目标线程(DestinationThread),该线程不断从队列中获取函数和参数,并执行该函数。

解决方法:

1. 创建一个目标线程(DestinationThread)。

2. 在目标线程中使用无限循环,以便持续地从队列中获取函数和参数。

3. 通过使用q.get()从队列中获取元素,其中q是一个队列对象。

4. 将获取的元素分解为函数和参数,并分别赋值给变量func和args。

5. 使用func(*args)执行函数,并传递参数args。

下面是具体的代码实现:

import queue
def DestinationThread(a):
    while True:
        items = q.get()
        func = items[0]
        args = items[1:]
        func(*args)
# 创建一个队列对象
q = queue.Queue()
# 将函数和参数放入队列中
q.put((function_name, arg1, arg2, ...))
# 创建并启动目标线程
thread = Thread(target=DestinationThread, args=(a,))
thread.start()

以上就是将函数和参数放入Python队列的方法,通过创建目标线程,并在该线程中不断从队列中获取函数和参数,并执行函数。这种方法可以实现将函数和参数异步地放入队列,以便后续处理。

0