2015-06-24 2 views
1

В моем проекте используется gevnet, что для меня ново, для реализации бережливого сервера.gevent, способы запуска запуска новых задач spawn

Я читаю код и изучаю его документ. Ниже приведен фрагмент кода в моем проекте:

TSocket.socket = gevent.socket # I find this when comparing the production 
           # code and mine. It seems that this socket 
           # schedule the tasks when there are newly-spawn ones. 
           # Could someone tell me more about it? 

while True: 
    try: 
     client = self.serverTransport.accept() 
     gevent.spawn(self._serve_client, client) 
    except (SystemExit, KeyboardInterrupt): 
     break 
    except Exception as x: 
     logging.exception(x) 

После нереста он непосредственно заканчивает работу здесь.

Но в моей собственной реализации, которая является для самостоятельного обучения, я должен сделать следующее:

while True: 
    try: 
     client = self.serverTransport.accept() 
     gevent.spawn(self._serve_client, client) 
     gevent.sleep(0) # switch to the newly-spawn task. 
         # this makes it to process tasks one by one and 
         # this makes it non-concurrent 
    except (SystemExit, KeyboardInterrupt): 
     break 
    except Exception as x: 
     logging.exception(x) 

В моем производстве код, я не нашел ни малейшего представления о том, как запускать задачи на запустить. Итак, я прошу здесь немного рассказать о способах запуска новых задач на сервере выше.

ответ

1

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

Строка TSocket.socket = gevent.socket в производственном коде исправляет ошибкупо умолчанию, чтобы использовать вместо gevent; gevent сокеты запускают цикл gevent, поэтому вам действительно нужен этот патч для запуска вашего кода.

Без патча TSocket.socket блокирует и убивает параллелизм (без потоков уровня ОС).

+0

Вы имеете в виду, что после патча кода gevent.socket будет контролировать цикл gevent. Как только появится новая зеленая зелень, она планирует ее запустить? – Alex

+0

Не совсем. Я имею в виду, что до тех пор, пока сокет gevent «активен», то есть он принимает или отправляет данные, цикл gevent будет работать. Например, если сокет заблокирован при вызове приема, и вы создаете новую грибочку, она будет запланирована, иначе нет. – mguijarr

+0

В вашем примере сокет представляет собой реорганизацию данных, т. Е. Порожденная зелень - это репликация данных. Согласно моему пониманию gevent, операция ввода-вывода переключит зелья. Если в это время появится новая зелень. Затем, после своего нереста, gevent немедленно переключится на новую зелень. Я здесь? – Alex