2016-03-17 3 views
4

У меня есть небольшая программа, которая выполняет некоторые вычисления в фоновом режиме, когда я вызываю ее через zerorpc модуль в python 2.7.Как обрабатывать несколько запросов к программе python с помощью zeromq и threading или async?

Вот мой код:

is_busy = False 

class Server(object): 
    def calculateSomeStuff(self): 
     global is_busy 

     if (is_busy): 
      return 'I am busy!' 

     is_busy = True 

     # calculate some stuff 

     is_busy = False 
     print 'Done!' 
     return 

    def getIsBusy(self): 
     return is_busy 

s = zerorpc.Server(Server()) 
s.bind("tcp://0.0.0.0:66666") 
s.run() 

Что я должен изменить, чтобы сделать эту программу возвращения is_busy, когда я называю .getIsBusy() метод, после того, как .calculateSomeStuff() начал делать его работу?

Насколько я знаю, нет никакого способа, чтобы сделать его асинхронным в питона 2.

ответ

2

Вам нужно многопоточность для реального параллелизма и использовать более одного ядра процессора, если это то, что вы после этого. См. Модуль резьбы Python, GIL -lock details & Возможные обходные пути и литература.

Если вам требуется совместное решение, прочитайте дальше.

zerorpc использует gevent для асинхронного ввода/вывода. С помощью gevent вы пишете сопрограммы (также называемые зелеными или нитями пользовательских), которые все работают совместно на одном потоке. Поток, в котором работает входной выходной цикл gevent. geventioloop заботится о возобновлении сопрограммы, ожидающих события ввода-вывода.

Ключевым моментом является слово кооператив. Сравните это с потоками, запущенными на одном процессоре/центральном процессоре. Эффективно нет ничего параллельного,
, но операционная система будет упредить (глагол: принять меры для предотвращения (ожидаемого события) события) работающий поток для выполнения следующего и так далее, чтобы каждый поток получает справедливую возможность двигаться вперед.

Это происходит достаточно быстро, так что кажется, что все потоки работают одновременно.

Если вы пишете код совместно с gevent ввода/вывода петли, вы можете достичь того же эффекта быть осторожным вызова gevent.sleep(0) достаточно часто, чтобы дать шанс для geventioloop для запуска других сопрограмм.

Это буквально кооперативный мультитрейдинг. Я слышал, что это было в Windows 2 или что-то в этом роде.

Итак, в вашем примере, в части тяжелого вычисления, у вас, вероятно, будет некоторый цикл. Не забудьте позвонить gevent.sleep(0) пару раз в секунду, и у вас будет иллюзия многопоточности.

Надеюсь, мой ответ не был слишком запутанным.

+1

Спасибо за ваш ответ! – t1maccapp