У меня есть программа на Python с двумя потоками (назовем их 'source' и
'место назначения' ). Исходная ветка иногда публикует сообщение по назначению
нить с некоторыми аргументами. Чем ветка назначения выбирает сообщение это
должен вызвать соответствующую функцию с сохраненными в сообщении арументами.
Эта задача может быть решена несколькими способами. Самый простой - это поставить большой
'if ... if..if' в цикле выбора сообщений целевого потока и вызова
функция в соответствии с типом полученного сообщения и сохраненными аргументами. Но это
приведет к огромному количеству кода (или большой справочной таблицы) и добавлению нового
Функция сообщения / обработчика будет развивать дополнительный шаг для написания кода в
цикл выбора сообщений.
Поскольку 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( 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)) вызовет ошибку компиляции: (