python 远程调度进程服务与客户端
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 远程调度进程服务与客户端的更多相关文章
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- 远程计算机 进程/服务 启动停止(WMI)
WMI的远程管理需要其计算机的本地管理员组权限,例:gwmi win32_computersystem -computer win08r2d #在远程计算机上启动 notepad.exe 进程invo ...
- python 并发编程 socket 服务端 客户端 阻塞io行为
阻塞io行为 server.accept server.recv client.send recv,accept 分为两个阶段 1.wait for data 对方把数据经过网络延迟送到自己的操作系 ...
- vscode连接云服务,搭建Python远程开发
配置Python远程开发环境前提 配置步骤 1.windows 10 开发机配置 win10 1809后支持ssh ssh-keygen -t rsa -b 4096 #会显示生成到的目录C:\Use ...
- Python异常处理和进程线程-day09
写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...
- python之路-进程
博客园 首页 新随笔 联系 管理 订阅 随笔- 31 文章- 72 评论- 115 python之路——进程 阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 ...
- python 操作系统和进程
一. 操作系统介绍 多道程序系统 多道程序设计技术 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种 ...
- Python 操作系统介绍 进程的创建
背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...
- python之路——进程
操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其 ...
随机推荐
- python中读取文件数据时要注意文件路径
我们在用python进行数据处理时往往需要将文件中的数据取出来做一些处理,这时我们应该注意数据文件的路径.文件路径不对,回报如下错误: FileNotFoundError: File b'..Adve ...
- Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配
二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...
- Android POJO 转换器 —> RapidOOO
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...
- Linux服务器搭建相关教程链接整理
Linux: Linux 教程 | 菜鸟教程 linux下如何添加一个用户并且让用户获得root权限 - !canfly - 博客园 Git: 在 Linux 下搭建 Git 服务器 - 黄棣-dee ...
- Dockerfile怎么创建镜像
编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像. 基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Docker ...
- 重载equals方法时要遵守的通用约定--自反性,对称性,传递性,一致性,非空性
本文涉及到的概念 1.为什么重载equals方法时,要遵守通用约定 2.重载equals方法时,要遵守哪些通用约定 为什么重载equals方法时,要遵守通用约定 Object类的非final方法都 ...
- Dynamics CRM2016 Web API之删除单个查找字段值
之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当 ...
- ubuntu重装指定版本的mysql
查看错误log cat /var/log/mysql/error.log 首先彻底删除mysql,比如版本5.5 apt-get autoremove --purge mysql-server-5.5 ...
- 大规模WebGL应用引发浏览器崩溃的几种情况及解决办法
一般的Web应用基本上不会导致浏览器崩溃,写Javascript代码也不需要管理内存资源,基本也不需要考虑内存"泄露"的问题.随着H5的崛起,越来越多的原本在桌面端的软件也改头换面 ...
- 数据库的case when 使用实例
本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50471210 需求很简单,我有一个部门和部门的请假申请表.表数据简 ...