python 内存数据库与远程服务
python 内存数据库与远程服务
需要import的python 内存数据库代码参考下面的链接:
http://blog.csdn.net/ubuntu64fan/article/details/50424683
现在的问题:
创建一个内存数据服务,可以供本地或远程用户连接上来,多个用户同时并发读写
这个内存数据库。
解决的步骤有3:
(1) 创建服务器(memdb_server.py)
(2) 创建客户端(memdb_client.py)
(3) 启动服务器,启动客户端
1 服务器代码:
#!/usr/bin/python
#-*- coding: UTF-8 -*-
# memdb_server.py
#
# 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
from memdb import MemDB
from memdb import MemDBConnect
# global variables
#
lock = RLock()
memdbConn = MemDBConnect(MemDB())
class MemDBManager(BaseManager): pass
# thread safe class
#
class MemDBConnectProxy(object):
global memdbConn
def QueryTables(self):
return memdbConn.QueryTablesNothrow()
def QueryTableKeys(self, tablename):
return memdbConn.QueryTableKeysNothrow(tablename)
def CreateTable(self, tablename):
memdbConn.CreateTableNothrow(tablename)
pass
def DropTable(self, tablename):
memdbConn.DropTableNothrow(tablename)
pass
def GetValue(self, tablename, key, defaultvalue):
return memdbConn.GetValueNothrow(tablename, key, defaultvalue)
def AddValue(self, tablename, key, value):
return memdbConn.AddValueNothrow(tablename, key, value)
def DelValue(self, tablename, key):
memdbConn.DelValueNothrow(tablename, key)
def AppendValueList(self, tablename, key, value, non_repeated_value):
memdbConn.AppendValueListNothrow(tablename, key, value, non_repeated_value)
def AppendValueListMulti(self, tablenames, keys, values, non_repeated_values):
memdbConn.AppendValueListMultiNothrow(tablenames, keys, values, non_repeated_values)
###########################################################
#
class MemDBManagerServer:
MemDBManager.register('get_lock', callable=lambda: lock)
MemDBManager.register('MemDBConnect', MemDBConnectProxy)
def __init__(self, host, port, passkey):
self.manager = MemDBManager(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.stop_flag = 1
pass
###########################################################
# start('', 12345, 'abc')
#
def start(host, port, passkey):
from memdb_server import MemDBManagerServer
server = MemDBManagerServer(host, port, passkey)
server.start()
2 客户端代码:
#!/usr/bin/python
#-*- coding: UTF-8 -*-
# memdb_client.py
#
# Queues are thread and process safe.
#
########################################################################
# 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
from memdb import *
class MemDBConnectProxy(object): pass
class MemDBManager(BaseManager): pass
class MemDBManagerClient:
MemDBManager.register('get_lock', callable=lambda: lock)
MemDBManager.register('MemDBConnect', callable=lambda: MemDBConnectProxy)
def __init__(self, servhost, servport, authkey):
self.config = {
"host": servhost,
"port": int(servport),
"authkey": authkey
}
self._lock = None
self.manager = MemDBManager(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 getMemDBConnect(self):
self.memdbConn = self.manager.MemDBConnect()
return self.memdbConn
###########################################################
# start('', 12345, 'abc')
#
def start(host, port, passkey):
from memdb_client import MemDBManagerClient
client = MemDBManagerClient(host, port, passkey)
print "connect to memdb server success"
memdbConn = client.getMemDBConnect()
tables = ["china", "america", "russian"]
# memdb_server.MemDBConnectProxy
for t in tables:
memdbConn.CreateTable(t)
print memdbConn.QueryTables()
memdbConn.AddValue("china", "capital", "Beijing")
memdbConn.AddValue("china", "1-city", "Shanghai")
memdbConn.AddValue("america", "capital", "Washington")
memdbConn.AddValue("america", "1-city", "Newyork")
memdbConn.AddValue("russian", "capital", "Moscow")
memdbConn.AddValue("russian", "1-city", "Moscow")
memdbConn.AppendValueListMulti(
["china", "america", "russian"],
["population", "population", "population"],
[130000, 30000, 20000],
[True, True, True])
for t in tables:
keys = memdbConn.QueryTableKeys(t)
for k in keys:
v = memdbConn.GetValue(t, k, None)
print "%s: %r=>%r" % (t, k, v)
3 开二个终端,分别启动服务和客户端:
服务端:
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import memdb_server
>>> memdb_server.start('', 12345, 'abc')
客户端:
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import memdb_client
>>> memdb_client.start('', 12345, 'abc')
connect to memdb server success
['russian', 'america', 'china']
china: '1-city'=>'Shanghai'
china: 'population'=>[130000]
china: 'capital'=>'Beijing'
america: '1-city'=>'Newyork'
america: 'population'=>[30000]
america: 'capital'=>'Washington'
russian: '1-city'=>'Moscow'
russian: 'population'=>[20000]
russian: 'capital'=>'Moscow'
>>>
python 内存数据库与远程服务的更多相关文章
- Python内存数据库/引擎
1 初探 在平时的开发工作中,我们可能会有这样的需求:我们希望有一个内存数据库或者数据引擎,用比较Pythonic的方式进行数据库的操作(比如说插入和查询). 举个具体的例子,分别向数据库db中插入两 ...
- python内存数据库pydblite
Pure-Python engine 最近由于项目开发中发现python informixDB模块对多线程的支持非常不好,当开启两个线程同时连接informix数据库的时候,数据库会报错,显示SQL ...
- 【python】-- Redis简介、命令、示例
Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- [Python] Create a Django project in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50158239 From: http://blog.csdn.net/u013088062 ...
- [Python] Interpreter setting in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50135135 From: http://blog.csdn.net/u013088062 ...
- 在ubunut下使用pycharm和eclipse进行python远程调试
我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...
- Python爬虫(图片)编写过程中遇到的问题
最近我突然对网络爬虫开窍了,真正做起来的时候发现并不算太难,都怪我以前有点懒,不过近两年编写了一些程序,手感积累了一些肯定也是因素,总之,还是惭愧了.好了,说正题,我把这两天做爬虫的过程中遇到的问题总 ...
- 轻量级开源内存数据库SQLite性能测试
[IT168 专稿]SQLite是一款轻型的数据库,它占用资源非常的低,同时能够跟很多程序语言相结合,但是支持的SQL语句不会逊色于其他开源数据库.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品 ...
随机推荐
- Linux学习之CentOS(二)--初识linux的一些常用命令(基础命令)
初次学习linux系统,首先也得会一些linux的基本命令.至少要先学会开启和关闭系统吧!我称为 基础命令! linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器. ...
- nodejs基础教程回顾01
最近在复习nodejs,因为框架太多隔一段时间不用就会忘了,所以没办法必须时常拿出来练练,就像家里有好几辆车,要时不常的轮流开一圈.我就从最基础的开始写,怎么下载安装就不说了,首先是nodejs的三类 ...
- Java8——快速入门手册(学习笔记)
github博文传送门 Java8特性学习笔记 Java8中新增了许多的新特性,在这里本人研究学习了几个较为常用的特性,在这里与大家进行分享.(这里推荐深入理解Java 8用于理解基础知识)本文分为以 ...
- 深入理解final关键字
在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方. 1.类的final变量和普通变量有什么区别? 当用final作用于类的成员变量时,成员变量(注意是类的成员变 ...
- delphi 线程教学第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行
第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行 以 Ado 为例,常见的方法是拖一个 AdoConnection 在窗口上(或 DataModule 中), 再配合 AdoQ ...
- python笔记五(条件判断/循环/break和continue)
一 条件判断 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> ...
- 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境
我的环境:虚拟机是:VMware-workstation-full-8.0.0-471780.exe:Linux系统用的是:CentOS-7-x86_64-Minimal-1503-01.ios;(阿 ...
- Go 语言数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- Linux(八)用户管理
8.1 基本介绍 Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账户,然后以这个账户身份进入系统. Linux的用户需要至少要属于一个组. 8 ...
- Dynamics CRM2016 Web API之删除单个查找字段值
之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当 ...