2016-01-07 2 views
1

Я пытаюсь вызвать сервер, чтобы проверить его статус. Код сервера имеет глобальную переменную «status», которая имеет значение True или False. Сервер отправляет либо «UP», либо «DOWN» на основе значения статуса.Глобальное изменение переменной не отражается на вызове сервера

Я импортирую файл сервера в свой основной файл и пытаюсь установить переменную в значение False. Затем я отправляю новый запрос и ожидаю статус «ВНИЗ».

myfile.py

import server 

response = urllib2.urlopen(url).read() #1 
server.print_status() #2 Prints True (the default value) as expected 
server.status = False #3 
server.print_status() #4 Prints False as expected 
response = urllib2.urlopen(url).read() #5 
server.print_status() #6 Prints False as expected 

server.py

status = True 

def print_status() 
    global status 
    print status 

class Handler(object): 
    @staticmethod 
    def handle(start_response): 
     global status 
     print status 
     if status: 
      start_response('200 OK') 
      return ['UP'] 
     else: 
      start_response('503 Service Unavailable') 
      return ['DOWN'] 

Теперь я ожидаю ответа 'вниз' на линии № 5, но он всегда возвращался 'UP'. Я также печатаю значение статуса в обработчике запросов сервера. Там статус напечатан как True (строка # 5) вместо False, хотя строки # 4 и # 6 печатают False.

В коде сервера нет проблем, что я уверен. Вероятно, это связано с тем, как я звоню на сервер или с помощью urllib2. Любые предложения о том, что я делаю неправильно.

+0

еще один код был бы полезен, без него ответ на ваш вопрос догадывается – Nhor

+0

@Nhor какая часть кода действительно поможет? – akipro

+0

ах .. Я думаю, серверный процесс, который отвечает на ваш HTTP-запрос, - это еще один процесс ... возможно, даже работает на другой машине ... – Pynchia

ответ

0

Как уже описано в моем комментарии и в ответе Даниэля, клиент и сервер представляют собой два разных процесса, которые не разделяют переменную status, даже если они определены в одном и том же модуле python, оба импортируют.

Я хотел бы предложить, чтобы клиент указать состояние с помощью вызова HTTP, отправляя его на сервер

query_args = { 'status': 'DOWN' } 
encoded_args = urllib.urlencode(query_args) 
response = urllib2.urlopen(url, encoded_args).read() 

, то сервер может проверить данные POST и обновлять свой статус, соответственно (предполагается, что все взаимодействие делает любой смысл)

0

Здесь недостаточно информации, чтобы правильно понять, что происходит. Но сам сервер почти наверняка работает в совершенно отдельном процессе, чтобы он мог отвечать на запросы. Внутренние переменные в этом процессе никоим образом не разделяются с теми, которые вы получаете, импортируя код в свою оболочку; они не могут быть.

Чтобы сделать эту работу, вам нужно будет фактически передать значение серверному процессу. Самый простой способ - записать его в файл и заставить сервер регулярно читать этот файл. Или вы могли бы добиться чего-то подобного с сокетами.

+0

Я добавил сервер обработчик тоже. Это довольно простой. Могу ли я каким-либо образом заставить инструкции запускаться в последовательном порядке и не писать в файл? – akipro

+1

Что означает «последовательный порядок»? Вы меняете переменную, которая является локальной для вашего сеанса консоли. Это не может повлиять на то, что работает в вашем сервере. –