python 远程调度进程服务与客户端

核心思想: 在本地或远程机器上创建一个进程,提供调度服务。使用了 APScheduler。

安装:APScheduler

$ wget https://pypi.python.org/packages/89/52/22f11f5ca425f16409797c5c651de380824a252acd1ced4ef1ee54507bbf/APScheduler-3.1.0.tar.gz#md5=fae7e2a06a5f4b608599bf8b237bb40a
$ python2.7 setup.py build
$ python2.7 setup.py install

测试:
$ python2.7 -c "from apscheduler.schedulers.blocking import BlockingScheduler"

服务端:

#!/usr/bin/python2.7
#-*- coding: UTF-8 -*-
#
#   apsserver.py
#
# Refer:
#   http://www.cnblogs.com/Xjng/p/4902514.html
#
# Queues are thread and process safe.
# Refer:
#   https://docs.python.org/2/library/multiprocessing.html
#
########################################################################
# The MIT License (MIT)
#    http://opensource.org/licenses/MIT
#
#  Copyright (c) 2015 copyright cheungmine
#
# Permission is hereby granted, free of charge, to any person obtaining
#  a copy of this software and associated documentation files (the
#  "Software"), to deal in the Software without restriction, including
#  without limitation the rights to use, copy, modify, merge, publish,
#  distribute, sublicense, and/or sell copies of the Software, and to
#  permit persons to whom the Software is furnished to do so, subject
#  to the following conditions:
#
# The above copyright notice and this permission notice shall be
#  included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
########################################################################

import os, time, datetime

from multiprocessing.managers import BaseManager
from multiprocessing import RLock

# aps
from apscheduler.schedulers.background import BackgroundScheduler
import logging
logging.basicConfig()

# global variables
#
lock = RLock()

scheduler = BackgroundScheduler()
scheduler.start()

class APSchedulerManager(BaseManager): pass

def tick():
    print('Tick! The time is: %s' % datetime.datetime.now())

# thread safe class
#
class APSchedulerConnectProxy(object):
    global scheduler

    def AddJob(self, config):
        print("AddJob: %s" % config)
        return scheduler.add_job(tick, 'interval', seconds=3)

    def Start(self):
        scheduler.start()

    def Shutdown(self, wait):
        scheduler.shutdown()

###########################################################
#
class APSchedulerManagerServer:
    APSchedulerManager.register('get_lock', callable=lambda: lock)
    APSchedulerManager.register('APSchedulerConnect', APSchedulerConnectProxy)

    def __init__(self, host, port, passkey):
        self.manager = APSchedulerManager(address=(host, port), authkey=passkey)
        self.server = self.manager.get_server()
        pass

    def start(self):
        self.server.serve_forever()
        pass

    def stop(self):
        self.server.shutdown()
        self.is_stop = 1
        pass

###########################################################
# start_apserver('', 12345, 'abc')
#
def start_apserver(host, port, passkey):
    from apsserver import APSchedulerManagerServer
    server = APSchedulerManagerServer(host, port, passkey)
    server.start()

###########################################################
# main
if __name__ == "__main__":
    from apsserver import APSchedulerManagerServer

    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        start_apserver('', 12345, 'abc')
    except (KeyboardInterrupt, SystemExit):
        print('\nUser has pressed Ctrl+Break')
    finally:
        pass

客户端:

#!/usr/bin/python2.7
#-*- coding: UTF-8 -*-
#
#   apsclient.py
#
# Refer:
#   http://www.cnblogs.com/Xjng/p/4902514.html
#
# Queues are thread and process safe.
# Refer:
#   https://docs.python.org/2/library/multiprocessing.html
#
########################################################################
# The MIT License (MIT)
#    http://opensource.org/licenses/MIT
#
#  Copyright (c) 2015 copyright cheungmine
#
# Permission is hereby granted, free of charge, to any person obtaining
#  a copy of this software and associated documentation files (the
#  "Software"), to deal in the Software without restriction, including
#  without limitation the rights to use, copy, modify, merge, publish,
#  distribute, sublicense, and/or sell copies of the Software, and to
#  permit persons to whom the Software is furnished to do so, subject
#  to the following conditions:
#
# The above copyright notice and this permission notice shall be
#  included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
########################################################################

from multiprocessing.managers import BaseManager
from multiprocessing import RLock

# aps
from apscheduler.schedulers.background import BackgroundScheduler
import logging
logging.basicConfig()

class APSchedulerConnectProxy(object): pass

class APSchedulerManager(BaseManager): pass

class APSchedulerManagerClient:
    APSchedulerManager.register('get_lock', callable=lambda: lock)
    APSchedulerManager.register('APSchedulerConnect', callable=lambda: APSchedulerConnectProxy)

    def __init__(self, servhost, servport, authkey):
        self.config = {
            "host": servhost,
            "port": int(servport),
            "authkey": authkey
        }

        self._lock = None
        self.manager = APSchedulerManager(address=(self.config['host'], self.config['port']), authkey=self.config['authkey'])
        self.manager.connect()
        pass

    def __del__(self):
        self.unlock()
        pass

    def lock(self):
        if not self._lock:
            self._lock = self.manager.get_lock()
            self._lock.acquire()
        pass

    def unlock(self):
        if self._lock:
            l = self._lock
            self._lock = None
            l.release()
        pass

    def getAPSchedulerConnect(self):
        self.apschedulerConn = self.manager.APSchedulerConnect()
        return self.apschedulerConn

###########################################################
# connect_apserver('', 12345, 'abc')
#
def connect_apserver(host, port, passkey):
    from apsclient import APSchedulerManagerClient

    client = APSchedulerManagerClient(host, port, passkey)

    print "connect to apsserver success"

    apschedulerConn = client.getAPSchedulerConnect()
    apschedulerConn.AddJob("hello apsserver")

###########################################################
# main
if __name__ == "__main__":
    import os

    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        connect_apserver('', 12345, 'abc')
    except (KeyboardInterrupt, SystemExit):
        print('\nUser has pressed Ctrl+Break')
    finally:
        pass

启动服务端与客户端。服务端输出:

./apsserver.py
Press Ctrl+C to exit
AddJob: hello apsserver
Tick! The time is: 2016-04-26 17:38:02.899242
Tick! The time is: 2016-04-26 17:38:05.899450
Tick! The time is: 2016-04-26 17:38:08.899632
Tick! The time is: 2016-04-26 17:38:11.900290

python 远程调度进程服务与客户端的更多相关文章

  1. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

  2. 远程计算机 进程/服务 启动停止(WMI)

    WMI的远程管理需要其计算机的本地管理员组权限,例:gwmi win32_computersystem -computer win08r2d #在远程计算机上启动 notepad.exe 进程invo ...

  3. python 并发编程 socket 服务端 客户端 阻塞io行为

    阻塞io行为 server.accept server.recv client.send recv,accept  分为两个阶段 1.wait for data 对方把数据经过网络延迟送到自己的操作系 ...

  4. vscode连接云服务,搭建Python远程开发

    配置Python远程开发环境前提 配置步骤 1.windows 10 开发机配置 win10 1809后支持ssh ssh-keygen -t rsa -b 4096 #会显示生成到的目录C:\Use ...

  5. Python异常处理和进程线程-day09

    写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...

  6. python之路-进程

    博客园 首页 新随笔 联系 管理 订阅 随笔- 31  文章- 72  评论- 115    python之路——进程   阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 ...

  7. python 操作系统和进程

    一. 操作系统介绍 多道程序系统 多道程序设计技术       所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种 ...

  8. Python 操作系统介绍 进程的创建

    背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...

  9. python之路——进程

    操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其 ...

随机推荐

  1. python中读取文件数据时要注意文件路径

    我们在用python进行数据处理时往往需要将文件中的数据取出来做一些处理,这时我们应该注意数据文件的路径.文件路径不对,回报如下错误: FileNotFoundError: File b'..Adve ...

  2. Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配

    二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  3. Android POJO 转换器 —> RapidOOO

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...

  4. Linux服务器搭建相关教程链接整理

    Linux: Linux 教程 | 菜鸟教程 linux下如何添加一个用户并且让用户获得root权限 - !canfly - 博客园 Git: 在 Linux 下搭建 Git 服务器 - 黄棣-dee ...

  5. Dockerfile怎么创建镜像

    编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像. 基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Docker ...

  6. 重载equals方法时要遵守的通用约定--自反性,对称性,传递性,一致性,非空性

    本文涉及到的概念 1.为什么重载equals方法时,要遵守通用约定 2.重载equals方法时,要遵守哪些通用约定   为什么重载equals方法时,要遵守通用约定 Object类的非final方法都 ...

  7. Dynamics CRM2016 Web API之删除单个查找字段值

    之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当 ...

  8. ubuntu重装指定版本的mysql

    查看错误log cat /var/log/mysql/error.log 首先彻底删除mysql,比如版本5.5 apt-get autoremove --purge mysql-server-5.5 ...

  9. 大规模WebGL应用引发浏览器崩溃的几种情况及解决办法

    一般的Web应用基本上不会导致浏览器崩溃,写Javascript代码也不需要管理内存资源,基本也不需要考虑内存"泄露"的问题.随着H5的崛起,越来越多的原本在桌面端的软件也改头换面 ...

  10. 数据库的case when 使用实例

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50471210 需求很简单,我有一个部门和部门的请假申请表.表数据简 ...