本文整理汇总了Python中circus.controller.Controller.stop方法的典型用法代码示例。如果您正苦于以下问题:Python Controller.stop方法的具体用法?Python Controller.stop怎么用?Python Controller.stop使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类circus.controller.Controller
的用法示例。
在下文中一共展示了Controller.stop方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
class Arbiter(object):
"""Class used to control a list of watchers.
Options:
- **watchers** -- a list of Watcher objects
- **endpoint** -- the controller ZMQ endpoint
- **pubsub_endpoint** -- the pubsub endpoint
- **stats_endpoint** -- the stats endpoint. If not provided,
the *circusd-stats* process will not be launched.
- **check_delay** -- the delay between two controller points
(default: 1 s)
- **prereload_fn** -- callable that will be executed on each reload
(default: None)
- **context** -- if provided, the zmq context to reuse.
(default: None)
- **loop**: if provided, a :class:`zmq.eventloop.ioloop.IOLoop` instance
to reuse. (default: None)
- **plugins** -- a list of plugins. Each item is a mapping with:
- **use** -- Fully qualified name that points to the plugin class
- every other value is passed to the plugin in the **config** option
"""
def __init__(self, watchers, endpoint, pubsub_endpoint, check_delay=1.,
prereload_fn=None, context=None, loop=None,
stats_endpoint=None, plugins=None):
self.watchers = watchers
self.endpoint = endpoint
self.check_delay = check_delay
self.prereload_fn = prereload_fn
self.pubsub_endpoint = pubsub_endpoint
# initialize zmq context
self.context = context or zmq.Context.instance()
self.loop = loop or ioloop.IOLoop()
self.ctrl = Controller(endpoint, self.context, self.loop, self,
check_delay)
self.pid = os.getpid()
self._watchers_names = {}
self.alive = True
self._lock = RLock()
# initializing circusd-stats as a watcher when configured
self.stats_endpoint = stats_endpoint
if self.stats_endpoint is not None:
cmd = "%s -c 'from circus import stats; stats.main()'" % \
sys.executable
cmd += ' --endpoint %s' % self.endpoint
cmd += ' --pubsub %s' % self.pubsub_endpoint
cmd += ' --statspoint %s' % self.stats_endpoint
stats_watcher = Watcher('circusd-stats', cmd)
self.watchers.append(stats_watcher)
self.plugins = plugins
self._plugins = {}
def _stop_plugins(self):
for plugin in self._plugins.values():
if not plugin.running:
continue
plugin.stop()
def _start_plugins(self):
self._stop_plugins()
self._plugins.clear()
if self.plugins is None:
return
for config in self.plugins:
fqn = config['use']
del config['use']
cls = resolve_name(fqn)
instance = cls(self.context, self.endpoint,
self.pubsub_endpoint, self.check_delay,
**config)
self._plugins[cls.name] = instance
for plugin in self._plugins.values():
if not plugin.active:
continue
plugin.start()
@classmethod
def load_from_config(cls, config_file):
cfg = get_config(config_file)
# hack reload ioloop to use the monkey patched version
reload(ioloop)
watchers = []
for watcher in cfg.get('watchers', []):
watchers.append(Watcher.load_from_config(watcher))
# creating arbiter
arbiter = cls(watchers, cfg['endpoint'], cfg['pubsub_endpoint'],
check_delay=cfg.get('check_delay', 1.),
prereload_fn=cfg.get('prereload_fn'),
stats_endpoint=cfg.get('stats_endpoint'),
#.........这里部分代码省略.........
示例2: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
#.........这里部分代码省略.........
"""Starts all the watchers.
The start command is an infinite loop that waits
for any command from a client and that watches all the
processes and restarts them if needed.
"""
logger.info("Starting master on pid %s", self.pid)
self.initialize()
# start controller
self.ctrl.start()
try:
# initialize processes
logger.debug('Initializing watchers')
for watcher in self.iter_watchers():
watcher.start()
time.sleep(self.warmup_delay)
logger.info('Arbiter now waiting for commands')
while True:
try:
self.loop.start()
except zmq.ZMQError as e:
if e.errno == errno.EINTR:
continue
else:
raise
else:
break
finally:
self.ctrl.stop()
self.evpub_socket.close()
def stop(self):
if self.alive:
self.stop_watchers(stop_alive=True)
self.loop.stop()
# close sockets
self.sockets.close_all()
def reap_processes(self):
# map watcher to pids
watchers_pids = {}
for watcher in self.iter_watchers():
if not watcher.stopped:
for process in watcher.processes.values():
watchers_pids[process.pid] = watcher
# detect dead children
while True:
try:
# wait for our child (so it's not a zombie)
pid, status = os.waitpid(-1, os.WNOHANG)
if not pid:
break
if pid in watchers_pids:
watcher = watchers_pids[pid]
watcher.reap_process(pid, status)
except OSError as e:
if e.errno == errno.EAGAIN:
示例3: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
class Arbiter(object):
"""Class used to control a list of watchers.
Options:
- **watchers** -- a list of Watcher objects
- **endpoint** -- the controller ZMQ endpoint
- **pubsub_endpoint** -- the pubsub endpoint
- **statsd** -- If True, a circusd-stats process is run (default: False)
- **stats_endpoint** -- the stats endpoint.
- **statsd_close_outputs** -- if True sends the circusd-stats stdout/stderr
to /dev/null (default: False)
- **multicast_endpoint** -- the multicast endpoint for circusd cluster
auto-discovery (default: udp://237.219.251.97:12027)
Multicast addr should be between 224.0.0.0 to 239.255.255.255 and the
same for the all cluster.
- **check_delay** -- the delay between two controller points
(default: 1 s)
- **prereload_fn** -- callable that will be executed on each reload
(default: None)
- **context** -- if provided, the zmq context to reuse.
(default: None)
- **loop**: if provided, a :class:`zmq.eventloop.ioloop.IOLoop` instance
to reuse. (default: None)
- **plugins** -- a list of plugins. Each item is a mapping with:
- **use** -- Fully qualified name that points to the plugin class
- every other value is passed to the plugin in the **config** option
- **sockets** -- a mapping of sockets. Each key is the socket name,
and each value a :class:`CircusSocket` class. (default: None)
- **warmup_delay** -- a delay in seconds between two watchers startup.
(default: 0)
- **httpd** -- If True, a circushttpd process is run (default: False)
- **httpd_host** -- the circushttpd host (default: localhost)
- **httpd_port** -- the circushttpd port (default: 8080)
- **httpd_close_outputs** -- if True, sends circushttpd stdout/stderr
to /dev/null. (default: False)
- **debug** -- if True, adds a lot of debug info in the stdout (default:
False)
- **debug_gc** -- if True, does gc.set_debug(gc.DEBUG_LEAK) (default:
False)
to circusd to analyze problems (default: False)
- **proc_name** -- the arbiter process name
- **fqdn_prefix** -- a prefix for the unique identifier of the circus
instance on the cluster.
- **endpoint_owner** -- unix user to chown the endpoint to if using ipc.
"""
def __init__(self, watchers, endpoint, pubsub_endpoint, check_delay=1.0,
prereload_fn=None, context=None, loop=None, statsd=False,
stats_endpoint=None, statsd_close_outputs=False,
multicast_endpoint=None, plugins=None,
sockets=None, warmup_delay=0, httpd=False,
httpd_host='localhost', httpd_port=8080,
httpd_close_outputs=False, debug=False, debug_gc=False,
ssh_server=None, proc_name='circusd', pidfile=None,
loglevel=None, logoutput=None, loggerconfig=None,
fqdn_prefix=None, umask=None, endpoint_owner=None):
self.watchers = watchers
self.endpoint = endpoint
self.check_delay = check_delay
self.prereload_fn = prereload_fn
self.pubsub_endpoint = pubsub_endpoint
self.multicast_endpoint = multicast_endpoint
self.proc_name = proc_name
self.ssh_server = ssh_server
self.evpub_socket = None
self.pidfile = pidfile
self.loglevel = loglevel
self.logoutput = logoutput
self.loggerconfig = loggerconfig
self.umask = umask
self.endpoint_owner = endpoint_owner
self._running = False
try:
# getfqdn appears to fail in Python3.3 in the unittest
# framework so fall back to gethostname
socket_fqdn = socket.getfqdn()
except KeyError:
socket_fqdn = socket.gethostname()
if fqdn_prefix is None:
fqdn = socket_fqdn
else:
fqdn = '{}@{}'.format(fqdn_prefix, socket_fqdn)
self.fqdn = fqdn
self.ctrl = self.loop = None
self._provided_loop = False
self.socket_event = False
if loop is not None:
self._provided_loop = True
self.loop = loop
# initialize zmq context
self._init_context(context)
self.pid = os.getpid()
self._watchers_names = {}
self._stopping = False
#.........这里部分代码省略.........
示例4: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
class Arbiter(object):
"""Class used to control a list of watchers.
Options:
- **watchers**: a list of Watcher objects
- **endpoint**: the controller ZMQ endpoint
- **pubsub_endpoint**: the pubsub endpoint
- **check_delay**: the delay between two controller points (default: 1 s)
- **prereload_fn**: callable that will be executed on each reload
(default: None)
"""
def __init__(
self,
watchers,
endpoint,
pubsub_endpoint,
check_delay=1.0,
prereload_fn=None,
context=None,
loop=None,
check_flapping=True,
):
self.watchers = watchers
self.endpoint = endpoint
self.check_delay = check_delay
self.prereload_fn = prereload_fn
self.pubsub_endpoint = pubsub_endpoint
# initialize zmq context
self.context = context or zmq.Context.instance()
self.loop = loop or ioloop.IOLoop()
self.ctrl = Controller(endpoint, self.context, self.loop, self, check_delay)
self.pid = os.getpid()
self._watchers_names = {}
self.alive = True
self.busy = False
self.check_flapping = check_flapping
@debuglog
def initialize(self):
# event pub socket
self.evpub_socket = self.context.socket(zmq.PUB)
self.evpub_socket.bind(self.pubsub_endpoint)
self.evpub_socket.linger = 0
# initialize flapping
if self.check_flapping:
self.flapping = Flapping(self.context, self.endpoint, self.pubsub_endpoint, self.check_delay)
# initialize watchers
for watcher in self.watchers:
self._watchers_names[watcher.name.lower()] = watcher
watcher.initialize(self.evpub_socket)
@debuglog
def start(self):
"""Starts all the watchers.
The start command is an infinite loop that waits
for any command from a client and that watches all the
processes and restarts them if needed.
"""
logger.info("Starting master on pid %s", self.pid)
self.initialize()
# start controller
self.ctrl.start()
# start flapping
if self.check_flapping:
logger.debug("Starting flapping")
self.flapping.start()
# initialize processes
logger.debug("Initializing watchers")
for watcher in self.watchers:
watcher.start()
logger.info("Arbiter now waiting for commands")
while True:
try:
self.loop.start()
except zmq.ZMQError as e:
if e.errno == errno.EINTR:
continue
else:
raise
else:
break
if self.check_flapping:
self.flapping.stop()
self.ctrl.stop()
self.evpub_socket.close()
#.........这里部分代码省略.........
示例5: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
#.........这里部分代码省略.........
added_wn = (new_wn - current_wn) | wn_with_changed_socket
deleted_wn = current_wn - new_wn - wn_with_changed_socket
maybechanged_wn = current_wn - deleted_wn
changed_wn = set([])
if wn_with_deleted_socket and wn_with_deleted_socket not in new_wn:
raise ValueError('Watchers %s uses a socket which is deleted' %
wn_with_deleted_socket)
# get changed watchers
for n in maybechanged_wn:
w = self.get_watcher(n)
new_watcher_cfg = (self.get_watcher_config(new_cfg, n) or
self.get_plugin_config(new_cfg, n))
old_watcher_cfg = w._cfg.copy()
if new_watcher_cfg != old_watcher_cfg:
if not w.name.startswith('plugin:'):
num_procs = new_watcher_cfg['numprocesses']
old_watcher_cfg['numprocesses'] = num_procs
if new_watcher_cfg == old_watcher_cfg:
# if nothing but the number of processes is
# changed, just changes this
w.set_numprocesses(int(num_procs))
continue
# Others things are changed. Just delete and add the watcher.
changed_wn.add(n)
deleted_wn.add(n)
added_wn.add(n)
# delete watchers
for n in deleted_wn:
w = self.get_watcher(n)
w.stop()
del self._watchers_names[w.name.lower()]
self.watchers.remove(w)
# add watchers
for n in added_wn:
new_watcher_cfg = (self.get_plugin_config(new_cfg, n) or
self.get_watcher_config(new_cfg, n))
w = Watcher.load_from_config(new_watcher_cfg)
w.initialize(self.evpub_socket, self.sockets, self)
self.start_watcher(w)
self.watchers.append(w)
self._watchers_names[w.name.lower()] = w
return False
@classmethod
def load_from_config(cls, config_file):
cfg = get_config(config_file)
watchers = []
for watcher in cfg.get('watchers', []):
watchers.append(Watcher.load_from_config(watcher))
sockets = []
for socket in cfg.get('sockets', []):
sockets.append(CircusSocket.load_from_config(socket))
httpd = cfg.get('httpd', False)
if httpd:
# controlling that we have what it takes to run the web UI
# if something is missing this will tell the user
示例6: Trainer
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
class Trainer(object):
def __init__(self, shows, endpoint, check_delay=1.0, ipc_path=None, prereload_fn=None):
self.shows = shows
self.endpoint = endpoint
self.check_delay = check_delay
self.ipc_path = ipc_path
self.prereload_fn = prereload_fn
self.ctrl = Controller(endpoint, self, self.check_delay, self.ipc_path)
self.pid = os.getpid()
self._shows_names = {}
self.alive = True
self._lock = Lock()
self.setup()
logger.info("Starting master on pid %s" % self.pid)
def setup(self):
for show in self.shows:
self._shows_names[show.name] = show
def start(self):
# launch flies
for show in self.shows:
show.manage_flies()
while self.alive:
# manage and reap flies
for show in self.shows:
show.reap_flies()
show.manage_flies()
# wait for the controller
self.ctrl.poll()
def stop(self, graceful=True):
self.alive = False
# kill flies
for show in self.shows:
show.stop(graceful=graceful)
self.ctrl.stop()
def reload(self):
if self.prereload_fn is not None:
self.prereload_fn(self)
# reopen log files
for handler in logger.handlers:
if isinstance(handler, logging.FileHandler):
handler.acquire()
handler.stream.close()
handler.stream = open(handler.baseFilename, handler.mode)
handler.release()
# gracefully reload shows
for show in self.shows:
show.reload()
def num_flies(self):
return sum([len(show) for show in self.shows])
def num_shows(self):
return len(self.shows)
def get_show(self, name):
return self._shows_names[name]
def add_show(self, show):
with self._lock:
if show.name in self._shows_names:
raise AlreadyExist("%r already exist" % show.name)
self.shows.append(show)
self._shows_names[show.name] = show
def del_show(self, name):
with self._lock:
# remove the show from the list
show = self._shows_names.pop(name)
del self.shows[self.shows.index(show)]
# stop the show
show.stop()
###################
# commands
###################
def handle_numflies(self):
return str(self.num_flies())
def handle_numshows(self):
return str(self.num_shows())
def handle_shows(self):
return ",".join(self._shows_names.keys())
def handle_flies(self):
flies = []
for show in self.shows:
flies.append("%s: %s" % (show.name, show.handle_flies()))
#.........这里部分代码省略.........
示例7: Arbiter
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
#.........这里部分代码省略.........
for any command from a client and that watches all the
processes and restarts them if needed.
"""
logger.info("Starting master on pid %s", self.pid)
self.initialize()
# start controller
self.ctrl.start()
# start flapping
if self.check_flapping:
logger.debug('Starting flapping')
self.flapping.start()
# initialize processes
logger.debug('Initializing watchers')
for watcher in self.watchers:
watcher.start()
logger.info('Arbiter now waiting for commands')
while True:
try:
self.loop.start()
except zmq.ZMQError as e:
if e.errno == errno.EINTR:
continue
else:
raise
else:
break
if self.check_flapping:
self.flapping.stop()
self.ctrl.stop()
self.evpub_socket.close()
def stop(self):
if self.alive:
self.stop_watchers(stop_alive=True)
self.loop.stop()
def manage_watchers(self):
if not self.busy and self.alive:
self.busy = True
# manage and reap processes
for watcher in self.watchers:
watcher.reap_processes()
watcher.manage_processes()
if self.check_flapping and not self.flapping.is_alive():
self.flapping = Flapping(self.context, self.endpoint,
self.pubsub_endpoint,
self.check_delay)
self.flapping.start()
self.busy = False
@debuglog
def reload(self, graceful=True):
"""Reloads everything.
Run the :func:`prereload_fn` callable if any, then gracefuly
reload all watchers.
"""
示例8: Trainer
# 需要导入模块: from circus.controller import Controller [as 别名]
# 或者: from circus.controller.Controller import stop [as 别名]
class Trainer(object):
def __init__(self, shows, endpoint, check_delay=1., ipc_path=None):
self.shows = shows
self.endpoint = endpoint
self.check_delay = check_delay
self.ipc_path = ipc_path
self.ctrl = Controller(endpoint, self, self.check_delay,
self.ipc_path)
self.pid = os.getpid()
self._shows_names = {}
self.alive = True
self._lock = Lock()
self.setup()
logger.info("Starting master on pid %s" % self.pid)
def setup(self):
for show in self.shows:
self._shows_names[show.name] = show
def start(self):
# launch flies
for show in self.shows:
show.manage_flies()
while self.alive:
# manage and reap flies
for show in self.shows:
show.reap_flies()
show.manage_flies()
# wait for the controller
self.ctrl.poll()
def stop(self):
self.alive = False
# kill flies
for show in self.shows:
show.stop()
self.ctrl.stop()
def num_flies(self):
return sum([len(show) for show in self.shows])
def num_shows(self):
return len(self.shows)
def get_show(self, name):
return self._shows_names[name]
def add_show(self, show):
with self._lock:
if show.name in self._shows_names:
raise AlreadyExist("%r already exist" % show.name)
self.shows.append(show)
self._shows_names[show.name] = show
def del_show(self, name):
with self._lock:
# remove the show from the list
show = self._shows_names.pop(name)
del self.shows[self.shows.index(show)]
# stop the show
show.stop()
###################
# commands
###################
def handle_shows(self):
return ",".join(self._shows_names.keys())
def handle_flies(self):
flies = []
for show in self.shows:
flies.append("%s: %s" % (show.name, show.handle_flies()))
return buffer("\n".join(flies))
def handle_info_shows(self):
infos = []
for show in self.shows:
infos.append("%s:\n" % show.name)
infos.append("%s\n" % show.handle_info())
return buffer("".join(infos))
def handle_reload(self):
return "ok"
def handle_winch(self):
"SIGWINCH handling"
if os.getppid() == 1 or os.getpgrp() != os.getpid():
for show in self.shows:
show.num_flies = 0
show.kill_flies()
else:
# SIGWINCH ignored. Not daemonized
pass
#.........这里部分代码省略.........