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

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

安装:APScheduler

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

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

服务端:

  1. #!/usr/bin/python2.7
  2. #-*- coding: UTF-8 -*-
  3. #
  4. # apsserver.py
  5. #
  6. # Refer:
  7. # http://www.cnblogs.com/Xjng/p/4902514.html
  8. #
  9. # Queues are thread and process safe.
  10. # Refer:
  11. # https://docs.python.org/2/library/multiprocessing.html
  12. #
  13. ########################################################################
  14. # The MIT License (MIT)
  15. # http://opensource.org/licenses/MIT
  16. #
  17. # Copyright (c) 2015 copyright cheungmine
  18. #
  19. # Permission is hereby granted, free of charge, to any person obtaining
  20. # a copy of this software and associated documentation files (the
  21. # "Software"), to deal in the Software without restriction, including
  22. # without limitation the rights to use, copy, modify, merge, publish,
  23. # distribute, sublicense, and/or sell copies of the Software, and to
  24. # permit persons to whom the Software is furnished to do so, subject
  25. # to the following conditions:
  26. #
  27. # The above copyright notice and this permission notice shall be
  28. # included in all copies or substantial portions of the Software.
  29. #
  30. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  33. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  34. # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  35. # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  36. # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. ########################################################################
  38.  
  39. import os, time, datetime
  40.  
  41. from multiprocessing.managers import BaseManager
  42. from multiprocessing import RLock
  43.  
  44. # aps
  45. from apscheduler.schedulers.background import BackgroundScheduler
  46. import logging
  47. logging.basicConfig()
  48.  
  49. # global variables
  50. #
  51. lock = RLock()
  52.  
  53. scheduler = BackgroundScheduler()
  54. scheduler.start()
  55.  
  56. class APSchedulerManager(BaseManager): pass
  57.  
  58. def tick():
  59. print('Tick! The time is: %s' % datetime.datetime.now())
  60.  
  61. # thread safe class
  62. #
  63. class APSchedulerConnectProxy(object):
  64. global scheduler
  65.  
  66. def AddJob(self, config):
  67. print("AddJob: %s" % config)
  68. return scheduler.add_job(tick, 'interval', seconds=3)
  69.  
  70. def Start(self):
  71. scheduler.start()
  72.  
  73. def Shutdown(self, wait):
  74. scheduler.shutdown()
  75.  
  76. ###########################################################
  77. #
  78. class APSchedulerManagerServer:
  79. APSchedulerManager.register('get_lock', callable=lambda: lock)
  80. APSchedulerManager.register('APSchedulerConnect', APSchedulerConnectProxy)
  81.  
  82. def __init__(self, host, port, passkey):
  83. self.manager = APSchedulerManager(address=(host, port), authkey=passkey)
  84. self.server = self.manager.get_server()
  85. pass
  86.  
  87. def start(self):
  88. self.server.serve_forever()
  89. pass
  90.  
  91. def stop(self):
  92. self.server.shutdown()
  93. self.is_stop = 1
  94. pass
  95.  
  96. ###########################################################
  97. # start_apserver('', 12345, 'abc')
  98. #
  99. def start_apserver(host, port, passkey):
  100. from apsserver import APSchedulerManagerServer
  101. server = APSchedulerManagerServer(host, port, passkey)
  102. server.start()
  103.  
  104. ###########################################################
  105. # main
  106. if __name__ == "__main__":
  107. from apsserver import APSchedulerManagerServer
  108.  
  109. print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
  110.  
  111. try:
  112. start_apserver('', 12345, 'abc')
  113. except (KeyboardInterrupt, SystemExit):
  114. print('\nUser has pressed Ctrl+Break')
  115. finally:
  116. pass

客户端:

  1. #!/usr/bin/python2.7
  2. #-*- coding: UTF-8 -*-
  3. #
  4. # apsclient.py
  5. #
  6. # Refer:
  7. # http://www.cnblogs.com/Xjng/p/4902514.html
  8. #
  9. # Queues are thread and process safe.
  10. # Refer:
  11. # https://docs.python.org/2/library/multiprocessing.html
  12. #
  13. ########################################################################
  14. # The MIT License (MIT)
  15. # http://opensource.org/licenses/MIT
  16. #
  17. # Copyright (c) 2015 copyright cheungmine
  18. #
  19. # Permission is hereby granted, free of charge, to any person obtaining
  20. # a copy of this software and associated documentation files (the
  21. # "Software"), to deal in the Software without restriction, including
  22. # without limitation the rights to use, copy, modify, merge, publish,
  23. # distribute, sublicense, and/or sell copies of the Software, and to
  24. # permit persons to whom the Software is furnished to do so, subject
  25. # to the following conditions:
  26. #
  27. # The above copyright notice and this permission notice shall be
  28. # included in all copies or substantial portions of the Software.
  29. #
  30. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  33. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  34. # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  35. # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  36. # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. ########################################################################
  38.  
  39. from multiprocessing.managers import BaseManager
  40. from multiprocessing import RLock
  41.  
  42. # aps
  43. from apscheduler.schedulers.background import BackgroundScheduler
  44. import logging
  45. logging.basicConfig()
  46.  
  47. class APSchedulerConnectProxy(object): pass
  48.  
  49. class APSchedulerManager(BaseManager): pass
  50.  
  51. class APSchedulerManagerClient:
  52. APSchedulerManager.register('get_lock', callable=lambda: lock)
  53. APSchedulerManager.register('APSchedulerConnect', callable=lambda: APSchedulerConnectProxy)
  54.  
  55. def __init__(self, servhost, servport, authkey):
  56. self.config = {
  57. "host": servhost,
  58. "port": int(servport),
  59. "authkey": authkey
  60. }
  61.  
  62. self._lock = None
  63. self.manager = APSchedulerManager(address=(self.config['host'], self.config['port']), authkey=self.config['authkey'])
  64. self.manager.connect()
  65. pass
  66.  
  67. def __del__(self):
  68. self.unlock()
  69. pass
  70.  
  71. def lock(self):
  72. if not self._lock:
  73. self._lock = self.manager.get_lock()
  74. self._lock.acquire()
  75. pass
  76.  
  77. def unlock(self):
  78. if self._lock:
  79. l = self._lock
  80. self._lock = None
  81. l.release()
  82. pass
  83.  
  84. def getAPSchedulerConnect(self):
  85. self.apschedulerConn = self.manager.APSchedulerConnect()
  86. return self.apschedulerConn
  87.  
  88. ###########################################################
  89. # connect_apserver('', 12345, 'abc')
  90. #
  91. def connect_apserver(host, port, passkey):
  92. from apsclient import APSchedulerManagerClient
  93.  
  94. client = APSchedulerManagerClient(host, port, passkey)
  95.  
  96. print "connect to apsserver success"
  97.  
  98. apschedulerConn = client.getAPSchedulerConnect()
  99. apschedulerConn.AddJob("hello apsserver")
  100.  
  101. ###########################################################
  102. # main
  103. if __name__ == "__main__":
  104. import os
  105.  
  106. print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
  107.  
  108. try:
  109. connect_apserver('', 12345, 'abc')
  110. except (KeyboardInterrupt, SystemExit):
  111. print('\nUser has pressed Ctrl+Break')
  112. finally:
  113. 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. bzoj3561DZY Loves Math VI

    3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 503  Solved: 333[Submit][Sta ...

  2. hdu 5573Binary Tree

    Binary Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  3. 在Unix系统中,主存索引节点和辅存索引节点从内容上比较有什么不同,为什么要设置主存索引节点?

    主存索引节点和辅存索引节点的不同主要体现在:主存索引节点状态:设备号.索引节点号:引用计数. 主存索引节点状态——反映主存索引节点的使用情况.它指示出: 1.  索引节点是否被锁上了: 2.  是否有 ...

  4. 非Unicode编码的软件如何在Windows系统上运行

    我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...

  5. Ajax来实现下拉框省市区三级联动效果(服务端基于express)

    //服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...

  6. python字典无限遍历

    #无限遍历dict,通过key获取value,嵌套字典存在多个相同的key,可获取多个key class getValues(object): def __init__(self): pass #无限 ...

  7. 59. Spiral Matrix II(中等,同54题)

    Given an integer \(n\), generate a square matrix filled with elements from 1 to \(n^2\) in spiral or ...

  8. HTML标签部分(块级/行级)

    一.基本块级标签 1.HTML标签的分类:      a.块级标签:显示为块状,独占一行,自动换行.      b.行级标签:在一行中,从左往右依次排列,不会自动换行. 2.h标签(标题标签) h标签 ...

  9. /bin/bash 常用命令

    ls -a 查看一切文件 ls -l 查看目录文件信息 clear 清屏(信息保留屏幕) reset 清屏(所有信息) ls *.txt 查看所有txt文件 wc 统计文件 -l 行数: - c 统计 ...

  10. HTTP与TCP的关系

    一直比较想写TCP与HTTP之间的关系,HTTP报文是如何通过tcp发送的,HTTP报文形式内容如何. HTTP请求包含请求行,请求头,请求体 HTTP响应包含响应头,响应头,响应体 下面我准备通过J ...