Python: отправить сообщение для обработки из класса - PullRequest
1 голос
/ 03 марта 2012

Этот вопрос может быть неясным - если так, то, вероятно, потому что я не совсем уверен, как задать вопрос - но здесь идет речь:

У меня есть класс Python, из которого я хотел бы вызвать функцию.

Класс не имеет доступа к данным, с которыми должна работать функция - в основном, я хотел бы, чтобы класс отправил сообщение другому процессу, который вызывает функцию. Что-то вроде:

from multiprocessing import Process

class Foo():
   def bar(phonenumber):
      do_something()
      send_message(phonenumber)

def daemon(data, phonenumber):
   while nothing_receivied(phonenumber):
      do_nothin()
      also_do_not_consume_too_much_CPU()
   if message_received(phonenumber):
      function(data)

p = Process(target=daemon, args=(data, phonenumber))
p.start()
p.join()

вызов Foo.bar(phonenumber) должен иметь дополнительный эффект при выполнении function на data - как это достижимо?

Ура! * * 1013

1 Ответ

0 голосов
/ 03 марта 2012

Если вы специально пытаетесь использовать модуль multiprocessing, вам, вероятно, стоит взглянуть на использование Queue / Pipe. http://docs.python.org/library/multiprocessing.html#pipes-and-queues

Часть кода вашего демона, где вы хотите сидеть и ничего не делать, не потребляя слишком много ресурсов ЦП, - это точка, где он пытается получить элемент из очереди или опрашивает канал для данных и блокирует, пока что-то не будет готово. , Другая сторона очереди или канала будет просто помещать данные в очередь, которая выполняет роль вашей send_message концепции.

Если вы хотите более надежное асинхронное решение, вам также следует проверить Twisted библиотеки: http://twistedmatrix.com/trac/

Это позволит вам определить сервис на более высоком уровне, который имеет цикл обработки событий с обработчиками для обработки входящих соединений.

И, наконец, если вам просто нужно простое решение в одном и том же сценарии, а не что-нибудь сетевое, вы можете просто использовать модуль потоков: http://docs.python.org/library/threading.html. И используйте Queue.Queue , чтобы демон блокировался с помощью get(), а send_message () выполняет put()

...