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‘
>>>
时间: 2025-01-05 22:10:20

python 内存数据库与远程服务的相关文章

python内存数据库pydblite

Pure-Python engine 最近由于项目开发中发现python informixDB模块对多线程的支持非常不好,当开启两个线程同时连接informix数据库的时候,数据库会报错,显示SQL process正在进行当中,根据python 多线程的机制我们怀疑是连接数据库时,informix将两个线程的cursor识别为同一个,故数据库报错.通过python中multiprocess模块讲所有关于数据库的操作全部改为多进程. 但是这就带来另外一个问题,在之前多线程的情况下,项目中维护着一个

$Django 路飞之redis内存数据库安装,python中使用,与Memcached,mongodb的区别

一 redis内存数据库安装 二 python中使用 三 redis,Memcached,mongodb的对比 原文地址:https://www.cnblogs.com/3sss-ss-s/p/10177083.html

python控制mysql的API手记

--------------------python控制mysql的API--------------------#import MySQLdb:引用对应的开发包#conn=MySQLdb.connect (host='localhost',user='root',passwd='root',db='test',port=3306):创建数据 库连接#cur=conn.cursor():创建游标 #cur.execute(self, query, args):执行单条sql语句,接收的参数为sq

最全Pycharm教程(4)——有关Python解释器的相关配置

最全Pycharm教程(1)——定制外观 最全Pycharm教程(2)——代码风格 最全Pycharm教程(3)——代码的调试.运行 1.准备工作 (1)Pycharm版本为3.4或者更高. (2)电脑上至少已经安装了一个Python解释器. (3)如果你希望配置一个远程解释器,则需要服务器的相关支持. 2.本地解释器配置 配置本地解释器的步骤相对简洁直观: (1)单击工具栏中的设置按钮. (2)在Settings/Preferences对话框中选中 Project Interpreter页面,

Python学习笔记第二十六周(Django补充)

一.基于jQuery的ajax实现(最底层方法:$.jax()) $.ajax( url: type:''POST" ) $.get(url,[data],[callback],[type])  #callback是发送成功后就执行的函数,type是告诉服务器需要什么数据,type:text|html|json|script $.post(url,[data],[callback],[type]) 例子: $.get('/jquery_get/',{name:'gavin'}) //name关键

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/

python学习笔记-Day11--paramiko

paramiko是python中一个遵循ssh2协议,并支持以加密和认证的方式 进行远程服务连接的模块 使用方法如下: 使用账号密码链接服务器 import paramiko #创建对象 ssh = paramiko.SSHClient() #设置访问策略,默认拒绝所有不明的server,这里使用AutoAddPolicy()添加服务器到 L{HostKeys}对象,允许链接不在know_host文件中的主机, ssh.set_missing_host_key_policy(paramiko.A

Python爬虫(图片)编写过程中遇到的问题

最近我突然对网络爬虫开窍了,真正做起来的时候发现并不算太难,都怪我以前有点懒,不过近两年编写了一些程序,手感积累了一些肯定也是因素,总之,还是惭愧了.好了,说正题,我把这两天做爬虫的过程中遇到的问题总结一下: 需求:做一个爬虫,爬取一个网站上所有的图片(只爬大图,小图标就略过) 思路:1.获取网站入口,这个入口网页上有很多图片集合入口,进入这些图片集合就能看到图片链接了,所以爬取的深度为2,比较简单:2.各个子图片集合内所包含的图片链接有两种形式:一种是绝对图片路径(直接下载即可),另一种的相对

java几种远程服务调用协议的比较

原文地址:http://www.cnblogs.com/jifeng/archive/2011/07/20/2111183.html 一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能. RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础.但它只能用于JAVA程序之间的通讯. Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防