Ejemplo n.º 1
0
def install_reactor(use_asyncio=False):
    """
    Borrowed from https://github.com/crossbario/autobahn-python/blob/master/autobahn/twisted/choosereactor.py
    """
    current_reactor = current_reactor_klass()    
    if current_reactor:
        return current_reactor

    if use_asyncio:
        #files=132, cost=186.99198293685913 seconds, speed=2007542.4309862417
        import asyncio
        import uvloop
        #asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
        asyncio.set_event_loop(uvloop.new_event_loop())
        from twisted.internet import asyncioreactor
        asyncioreactor.install()
    elif 'bsd' in sys.platform or sys.platform.startswith('darwin'):
        # This reactor is faster in MacOS
        # files=132, cost=61.64284586906433 seconds, speed=6089828.182127992
        # files=132, cost=58.344452142715454 seconds, speed=6434105.149907892
        # *BSD and MacOSX
        #
        from twisted.internet import kqreactor
        kqreactor.install()
    elif sys.platform in ['win32']:
        from twisted.internet.iocpreactor import reactor as iocpreactor
        iocpreactor.install()
    elif sys.platform.startswith('linux'):
        from twisted.internet import epollreactor
        epollreactor.install()
    else:
        from twisted.internet import selectreactor
        selectreactor.install()
    from twisted.internet import reactor
    return reactor
Ejemplo n.º 2
0
    def set_reactor():
        import platform

        REACTORNAME = DEFAULT_REACTORS.get(platform.system(), "select")
        # get the reactor in here
        if REACTORNAME == "kqueue":
            from twisted.internet import kqreactor

            kqreactor.install()
        elif REACTORNAME == "epoll":
            from twisted.internet import epollreactor

            epollreactor.install()
        elif REACTORNAME == "poll":
            from twisted.internet import pollreactor

            pollreactor.install()
        else:  # select is the default
            from twisted.internet import selectreactor

            selectreactor.install()

        from twisted.internet import reactor

        set_reactor = lambda: reactor
        return reactor
Ejemplo n.º 3
0
def setup_default_reactor(test):
    if 'twisted.internet.reactor' in sys.modules:
        del sys.modules['twisted.internet.reactor']

    from twisted.internet import selectreactor
    selectreactor.install()

    from twisted.internet import reactor
    return reactor
Ejemplo n.º 4
0
    def SvcDoRun(self):
        try:
            logmsg("service run")
            import servicemanager
            # Write a 'started' event to the event log...
            win32evtlogutil.ReportEvent(
                self._svc_display_name_,
                servicemanager.PYS_SERVICE_STARTED,
                0,  # category
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                (self._svc_name_, ''))

            reactor_type = registry.get_registry_value('reactor')
            if reactor_type == 'iocp':
                from twisted.internet import iocpreactor
                iocpreactor.install()
            else:
                from twisted.internet import selectreactor
                selectreactor.install()
            from twisted.internet import reactor

            if os.path.exists('DISABLE_STARTUP'):
                logmsg("DISABLE_STARTUP exists: exiting")
            else:
                logmsg("runing reactorthread")

                # launch main thread...
                thread.start_new_thread(self.launch_node, ())

                # ...and block until service stop request
                win32event.WaitForSingleObject(self.hWaitStop,
                                               win32event.INFINITE)

                logmsg("wake up")

                reactor.callFromThread(reactor.stop)

                time.sleep(2)  # give the node/reactor a chance to cleanup

            # and write a 'stopped' event to the event log.
            win32evtlogutil.ReportEvent(
                self._svc_display_name_,
                servicemanager.PYS_SERVICE_STOPPED,
                0,  # category
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                (self._svc_name_, ''))
        except:
            try:
                logmsg("exception")
                traceback.print_exc(None, logfilehandle)
                logfilehandle.flush()
                logfilehandle.close()
            except:
                os.abort()
Ejemplo n.º 5
0
    def SvcDoRun(self):
        try:
            logmsg("service run")
            import servicemanager
            # Write a 'started' event to the event log...
            win32evtlogutil.ReportEvent(self._svc_display_name_,
                                        servicemanager.PYS_SERVICE_STARTED,
                                        0, # category
                                        servicemanager.EVENTLOG_INFORMATION_TYPE,
                                        (self._svc_name_, ''))

            reactor_type = registry.get_registry_value('reactor')
            if reactor_type == 'iocp':
                from twisted.internet import iocpreactor
                iocpreactor.install()
            else:
                from twisted.internet import selectreactor
                selectreactor.install()
            from twisted.internet import reactor

            if os.path.exists('DISABLE_STARTUP'):
                logmsg("DISABLE_STARTUP exists: exiting")
            else:
                logmsg("runing reactorthread")

                # launch main thread...
                thread.start_new_thread(self.launch_node, ())

                # ...and block until service stop request
                win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

                logmsg("wake up")

                reactor.callFromThread(reactor.stop)

                time.sleep(2) # give the node/reactor a chance to cleanup

            # and write a 'stopped' event to the event log.
            win32evtlogutil.ReportEvent(self._svc_display_name_,
                                        servicemanager.PYS_SERVICE_STOPPED,
                                        0, # category
                                        servicemanager.EVENTLOG_INFORMATION_TYPE,
                                        (self._svc_name_, ''))
        except:
            try:
                logmsg("exception")
                traceback.print_exc(None, logfilehandle)
                logfilehandle.flush()
                logfilehandle.close()
            except:
                os.abort()
Ejemplo n.º 6
0
def set_reactor():
    import platform
    REACTORNAME = DEFAULT_REACTORS.get(platform.system(), 'select')
    #get the reactor in here
    if REACTORNAME == 'kqueue':
        from twisted.internet import kqreactor
        kqreactor.install()
    elif REACTORNAME == 'epoll':
        from twisted.internet import epollreactor
        epollreactor.install()
    elif REACTORNAME == 'poll':
        from twisted.internet import pollreactor
        pollreactor.install()
    else:  #select is the default
        from twisted.internet import selectreactor
        selectreactor.install()

    from twisted.internet import reactor
    set_reactor = lambda: reactor
    return reactor
Ejemplo n.º 7
0
    def set_reactor(self):
        """sets the reactor up"""
        #get the reactor in here
        if self.REACTORNAME == 'kqueue':
            from twisted.internet import kqreactor
            kqreactor.install()
        elif self.REACTORNAME == 'epoll':
            from twisted.internet import epollreactor
            epollreactor.install()
        elif self.REACTORNAME == 'poll':
            from twisted.internet import pollreactor
            pollreactor.install()
        else: #select is the default
            from twisted.internet import selectreactor
            selectreactor.install()

        from twisted.internet import reactor
        self.reactor = reactor
        #shouldn't have to, but sys.exit is scary
        self.reactor.callWhenRunning(self._protect)
        #prevent this from being called ever again
        self.set_reactor = lambda: None
Ejemplo n.º 8
0
    def set_reactor(self):
        """sets the reactor up"""
        #get the reactor in here
        if self.REACTORNAME == 'kqueue':
            from twisted.internet import kqreactor
            kqreactor.install()
        elif self.REACTORNAME == 'epoll':
            from twisted.internet import epollreactor
            epollreactor.install()
        elif self.REACTORNAME == 'poll':
            from twisted.internet import pollreactor
            pollreactor.install()
        else:  #select is the default
            from twisted.internet import selectreactor
            selectreactor.install()

        from twisted.internet import reactor
        self.reactor = reactor
        #shouldn't have to, but sys.exit is scary
        self.reactor.callWhenRunning(self._protect)
        #prevent this from being called ever again
        self.set_reactor = lambda: None
Ejemplo n.º 9
0
import socket
import random
import config
import platform
_platform = platform.system().lower()
if _platform == 'windows':
    from twisted.internet import iocpreactor
    try:
        #http://sourceforge.net/projects/pywin32/
        iocpreactor.install()
    except:
        pass
elif _platform == 'darwin':
    from twisted.internet import selectreactor
    try:
        selectreactor.install()
    except:
        pass
else:
    from twisted.internet import epollreactor
    try:
        epollreactor.install()
    except:
        pass

from session import Session


class Server(Protocol):

    def __init__(self, session):
Ejemplo n.º 10
0
from ziface import Iserver,Iprotocol

from twisted.internet import selectreactor
selectreactor.install()

from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

#自定义协议
from protocol import PingProtocol

#路由定制
from msghandler import IMsgHandler

#配置
from utils.config import Config

#实现服务器
class Server(Iserver.IServer):
    def __init__(self,name=Config.Name,
                   ipversion=Config.Version,
                   ip=Config.Host,
                   port=Config.Port,

                   protocol=PingProtocol,
                   routers=None):
        self.name=name
        self.ipversion=ipversion
        self.ip=ip
        self.port=port
        self.protocol=protocol
Ejemplo n.º 11
0
def install_optimal_reactor(require_optimal_reactor=True):
    """
    Try to install the optimal Twisted reactor for this platform:

    - Linux:   epoll
    - BSD/OSX: kqueue
    - Windows: iocp
    - Other:   select

    Notes:

    - This function exists, because the reactor types selected based on platform
      in `twisted.internet.default` are different from here.
    - The imports are inlined, because the Twisted code base is notorious for
      importing the reactor as a side-effect of merely importing. Hence we postpone
      all importing.

    See: http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html#reactor-functionality

    :param require_optimal_reactor: If ``True`` and the desired reactor could not be installed,
        raise ``ReactorAlreadyInstalledError``, else fallback to another reactor.
    :type require_optimal_reactor: bool

    :returns: The Twisted reactor in place (`twisted.internet.reactor`).
    """
    log = txaio.make_logger()

    # determine currently installed reactor, if any
    #
    current_reactor = current_reactor_klass()

    # depending on platform, install optimal reactor
    #
    if 'bsd' in sys.platform or sys.platform.startswith('darwin'):

        # *BSD and MacOSX
        #
        if current_reactor != 'KQueueReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import kqreactor
                    kqreactor.install()
                except:
                    log.warn('Running on *BSD or MacOSX, but cannot install kqueue Twisted reactor: {tb}', tb=traceback.format_exc())
                else:
                    log.debug('Running on *BSD or MacOSX and optimal reactor (kqueue) was installed.')
            else:
                log.warn('Running on *BSD or MacOSX, but cannot install kqueue Twisted reactor, because another reactor ({klass}) is already installed.', klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug('Running on *BSD or MacOSX and optimal reactor (kqueue) already installed.')

    elif sys.platform in ['win32']:

        # Windows
        #
        if current_reactor != 'IOCPReactor':
            if current_reactor is None:
                try:
                    from twisted.internet.iocpreactor import reactor as iocpreactor
                    iocpreactor.install()
                except:
                    log.warn('Running on Windows, but cannot install IOCP Twisted reactor: {tb}', tb=traceback.format_exc())
                else:
                    log.debug('Running on Windows and optimal reactor (ICOP) was installed.')
            else:
                log.warn('Running on Windows, but cannot install IOCP Twisted reactor, because another reactor ({klass}) is already installed.', klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug('Running on Windows and optimal reactor (ICOP) already installed.')

    elif sys.platform.startswith('linux'):

        # Linux
        #
        if current_reactor != 'EPollReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import epollreactor
                    epollreactor.install()
                except:
                    log.warn('Running on Linux, but cannot install Epoll Twisted reactor: {tb}', tb=traceback.format_exc())
                else:
                    log.debug('Running on Linux and optimal reactor (epoll) was installed.')
            else:
                log.warn('Running on Linux, but cannot install Epoll Twisted reactor, because another reactor ({klass}) is already installed.', klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug('Running on Linux and optimal reactor (epoll) already installed.')

    else:

        # Other platform
        #
        if current_reactor != 'SelectReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import selectreactor
                    selectreactor.install()
                    # from twisted.internet import default as defaultreactor
                    # defaultreactor.install()
                except:
                    log.warn('Running on "{platform}", but cannot install Select Twisted reactor: {tb}', tb=traceback.format_exc(), platform=sys.platform)
                else:
                    log.debug('Running on "{platform}" and optimal reactor (Select) was installed.', platform=sys.platform)
            else:
                log.warn('Running on "{platform}", but cannot install Select Twisted reactor, because another reactor ({klass}) is already installed.', klass=current_reactor, platform=sys.platform)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug('Running on "{platform}" and optimal reactor (Select) already installed.', platform=sys.platform)

    from twisted.internet import reactor
    txaio.config.loop = reactor

    return reactor
Ejemplo n.º 12
0
interface.
'''
import os

# Allows us to select which Twisted reactor to use. Must be done before any
# Twisted import calls.
r = os.environ.get('JUNEBUG_REACTOR', 'DEFAULT')
if r == "SELECT":
    from twisted.internet import selectreactor as r
elif r == "POLL":
    from twisted.internet import pollreactor as r
elif r == "KQUEUE":
    from twisted.internet import kqreactor as r
elif r == "WFMO":
    from twisted.internet import win32eventreactor as r
elif r == "IOCP":
    from twisted.internet import iocpreactor as r
elif r == "EPOLL":
    from twisted.internet import epollreactor as r
elif r == "DEFAULT":
    r = None
else:
    raise RuntimeError("Unsupported JUNEBUG_REACTOR setting %r" % (r,))
if r is not None:
    r.install()

from junebug.api import JunebugApi

__all__ = ['JunebugApi']
__version__ = '0.1.12'
Ejemplo n.º 13
0
def install_optimal_reactor(require_optimal_reactor=True):
    """
    Try to install the optimal Twisted reactor for this platform:

    - Linux:   epoll
    - BSD/OSX: kqueue
    - Windows: iocp
    - Other:   select

    Notes:

    - This function exists, because the reactor types selected based on platform
      in `twisted.internet.default` are different from here.
    - The imports are inlined, because the Twisted code base is notorious for
      importing the reactor as a side-effect of merely importing. Hence we postpone
      all importing.

    See: http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html#reactor-functionality

    :param require_optimal_reactor: If ``True`` and the desired reactor could not be installed,
        raise ``ReactorAlreadyInstalledError``, else fallback to another reactor.
    :type require_optimal_reactor: bool

    :returns: The Twisted reactor in place (`twisted.internet.reactor`).
    """
    log = txaio.make_logger()

    # determine currently installed reactor, if any
    #
    current_reactor = current_reactor_klass()

    # depending on platform, install optimal reactor
    #
    if 'bsd' in sys.platform or sys.platform.startswith('darwin'):

        # *BSD and MacOSX
        #
        if current_reactor != 'KQueueReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import kqreactor
                    kqreactor.install()
                except:
                    log.warn(
                        'Running on *BSD or MacOSX, but cannot install kqueue Twisted reactor: {tb}',
                        tb=traceback.format_exc())
                else:
                    log.debug(
                        'Running on *BSD or MacOSX and optimal reactor (kqueue) was installed.'
                    )
            else:
                log.warn(
                    'Running on *BSD or MacOSX, but cannot install kqueue Twisted reactor, because another reactor ({klass}) is already installed.',
                    klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug(
                'Running on *BSD or MacOSX and optimal reactor (kqueue) already installed.'
            )

    elif sys.platform in ['win32']:

        # Windows
        #
        if current_reactor != 'IOCPReactor':
            if current_reactor is None:
                try:
                    from twisted.internet.iocpreactor import reactor as iocpreactor
                    iocpreactor.install()
                except:
                    log.warn(
                        'Running on Windows, but cannot install IOCP Twisted reactor: {tb}',
                        tb=traceback.format_exc())
                else:
                    log.debug(
                        'Running on Windows and optimal reactor (ICOP) was installed.'
                    )
            else:
                log.warn(
                    'Running on Windows, but cannot install IOCP Twisted reactor, because another reactor ({klass}) is already installed.',
                    klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug(
                'Running on Windows and optimal reactor (ICOP) already installed.'
            )

    elif sys.platform.startswith('linux'):

        # Linux
        #
        if current_reactor != 'EPollReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import epollreactor
                    epollreactor.install()
                except:
                    log.warn(
                        'Running on Linux, but cannot install Epoll Twisted reactor: {tb}',
                        tb=traceback.format_exc())
                else:
                    log.debug(
                        'Running on Linux and optimal reactor (epoll) was installed.'
                    )
            else:
                log.warn(
                    'Running on Linux, but cannot install Epoll Twisted reactor, because another reactor ({klass}) is already installed.',
                    klass=current_reactor)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug(
                'Running on Linux and optimal reactor (epoll) already installed.'
            )

    else:

        # Other platform
        #
        if current_reactor != 'SelectReactor':
            if current_reactor is None:
                try:
                    from twisted.internet import selectreactor
                    selectreactor.install()
                    # from twisted.internet import default as defaultreactor
                    # defaultreactor.install()
                except:
                    log.warn(
                        'Running on "{platform}", but cannot install Select Twisted reactor: {tb}',
                        tb=traceback.format_exc(),
                        platform=sys.platform)
                else:
                    log.debug(
                        'Running on "{platform}" and optimal reactor (Select) was installed.',
                        platform=sys.platform)
            else:
                log.warn(
                    'Running on "{platform}", but cannot install Select Twisted reactor, because another reactor ({klass}) is already installed.',
                    klass=current_reactor,
                    platform=sys.platform)
                if require_optimal_reactor:
                    raise ReactorAlreadyInstalledError()
        else:
            log.debug(
                'Running on "{platform}" and optimal reactor (Select) already installed.',
                platform=sys.platform)

    from twisted.internet import reactor
    txaio.config.loop = reactor

    return reactor
Ejemplo n.º 14
0
def pytest_configure(config):
    from twisted.internet import selectreactor
    selectreactor.install()
Ejemplo n.º 15
0
Archivo: run.py Proyecto: SMAC/corelib
 def execute(self, settings, id):
     print "Starting module from {0} with ID {1}".format(settings, id)
     
     conf.settings = conf.Settings.from_file(settings)
     
     # @todo: Install the chosen reactor (look at settings.reactor)
     #from twisted.internet import reactor
     from twisted.internet.selectreactor import install
     reactor = install()
     
     sys.path.insert(0, os.path.dirname(settings))
     
     # The module should now be on the path, let's search for it.
     from smac.modules import base, utils
     
     try:
         # The get_class_instance function loads the 'implementation'
         # module by default. Search for an instance of base.ModuleBase
         # in the 'implementation' module.
         # The 'implementation module should be defined by the SMAC module
         # and thus contained in the directory which we just inserted in
         # the path.
         handler = utils.get_class(base.ModuleBase)
     except ImportError as e:
         print "The 'implementation' python module was not found."
         print e
         import traceback
         traceback.print_exc()
         sys.exit(1)
         
     if handler is None:
         print "No instances of 'smac.modules.base.ModuleBase' were ", \
               "found in the 'implementation' python module."
         sys.exit(1)
     
     def amqp_service(interface):
         return interface.extends(AMQPService.Iface)
     
     def rpc_service(interface):
         return interface.extends(RPCService.Iface)
     
     amqp_interface = filter(amqp_service, list(implementedBy(handler)))[0]
     amqp_processor = utils.get_module_for_interface(amqp_interface)
     
     try:
         rpc_interface = filter(rpc_service, list(implementedBy(handler)))[0]
     except IndexError:
         pass
     else:
         rpc_processor = utils.get_module_for_interface(rpc_interface)
         startup_registry['rpc_processor'] = rpc_processor
     
     # Save the necessary variables in the global registry to be used by
     # the runner called by twisted.runApp()
     startup_registry['amqp_processor'] = amqp_processor
     startup_registry['handler'] = handler
     startup_registry['instance_id'] = id
     startup_registry['__name__'] = '__main__'
     
     runner = os.path.join(os.path.dirname(base.__file__), 'runner.py')
     
     # Initialize basic configuration of the twisted application runner
     # @TODO: Move this to the `smac run` command
     from twisted.scripts import twistd
     
     config = twistd.ServerOptions()
     options = ['-noy', runner]
     if runtime.platformType != "win32":
         options.append('--pidfile={0}.pid'.format(id))
     config.parseOptions(options)
     
     # Set the terminal title
     print "\x1b]2;SMAC Module - {0} {1}\x07".format(handler.__name__, id)
     
     print "Initialization succeded, passing control to twistd\n"
     
     # Run the selected module
     twistd.runApp(config)