У меня есть программа python с двумя потоками (давайте назовите их "источник" и 'место назначения'). Исходная нить иногда отправляет сообщение в пункт назначения поток с некоторыми аргументами. Чем поток назначения выбирает сообщение должен вызвать соответствующую функцию с данными, сохраненными в сообщении.
Эта задача может быть решена несколькими способами. Легкий - это 'if... if..if' в цикле выбора сообщения потока назначения и вызова функции в соответствии с принятым типом сообщения и сохраненными аргументами. Но это приведет к огромному количеству кода (или большой таблицы поиска) и добавлению новых функция сообщений/обработчиков будет генерировать дополнительный шаг для написания кода в цикл выбора сообщения.
Так как python рассматривает функции как объекты первого класса и имеет кортежи, я хочу поставить функцию и argumens внутри сообщения, а не поток назначения выбирает сообщение, которое он просто вызывает functon, сохраненный в сообщении без каких-либо знание, какая функция.
Я могу написать код для функций с указанным числом аргументов:
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( a ) :
while True :
(f, a, b) = q.get()
f( a, b )
start_new_thread( DestinationThread, ( 0, ) )
print "start"
sleep( 1 )
q.put( (HandleMsg, 1, 2) )
sleep( 1 )
print "stop"
Вопрос в том, как изменить код, чтобы я мог поставить() функцию с любое количество аргументов в очереди? например HandleAnotherMsg()? Использование q.put((HandleAnotherMsg, 1, 2, 3)) приведет к ошибке компиляции: (