如何将函数和参数放入Python队列中?
如何将函数和参数放入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))会引发编译错误 🙁
问题的出现原因是想要将函数和参数放入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队列中有所帮助!
在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/…
问题的出现原因:
问题是关于如何将一个函数和参数放入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队列的方法,通过创建目标线程,并在该线程中不断从队列中获取函数和参数,并执行函数。这种方法可以实现将函数和参数异步地放入队列,以便后续处理。