# 安装
补充上传到pypi了,传的sdist,所以也支持python2。
```
pip3 install sharedmap
```
# 示例
```
import sharedmap
def t1():
wmap = sharedmap.rbtree();
wmap.set("aaa","323");
wmap.set("zb","1233");
wmap.set("tes","32z");
wmap.set("红","32是");
print(wmap.get("tes"));
wmap.share("test:3325",force=True);
print("测试写入");
t1();
def t2():
rmap = sharedmap.sharedmap("test:3325");
print(rmap.get("红"));
print("测试读取");
t2();
```
# 工具类
## rbtree
这个类用c++代码模拟了一个简单的字符串字典。该字典可以通过```share```方法向共享内存写入一个```sharedmap```。
### ```set```
| 参数 | 类型 | 说明 |
| - | - | - |
| key | str | |
| val | str | |
| 返回值 | bool | 成功True |
该方法失败的时候会抛出异常。
### ```get```
| 参数 | 类型 | 说明 |
| - | - | - |
| key | str | |
| 返回值 | str | |
### ```share```
把字典当前状态制作成一个快照(基于索引的内存池和avl树)保存到共享内存中,这个快照可以通过```sharedmap```读取。
| 参数 | 类型 | 说明 |
| - | - | - |
| name | str | 共享字典的名字,sharedmap在初始化的时候会用到 |
| force | bool | 如果该名字的共享字典已经存在,是否删掉旧的重建。 |
| 返回值 | bool | 成功True |
该方法失败的时候会抛出异常。
### ```dump```
把字典当前状态制作成一个快照返回成```bytes```这个二进制数组其实就是```sharedmap```的内存结构。(目前没提供读取的办法,所以这个方法其实没什么意义)
| 参数 | 类型 | 说明 |
| - | - | - |
| name | str | 共享字典的名字,sharedmap在初始化的时候会用到 |
| 返回值 | bytes | 成功True |
### ```remove```
这是一个静态方法,用户删除由```share```方法构造的共享内存```sharedmap```,删除操作不要求和写入操作在同一个进程中。删除后,已经获取的```sharedmap```依然有效,无法通过该名字获得```sharedmap```对象。删除后可以通过```share```方法建立新的```sharedmap```。更多细节和清理内存的时机参考共享内存的原理。
| 参数 | 类型 | 说明 |
| - | - | - |
| name | str | 共享字典的名字,sharedmap在初始化的时候会用到 |
| 返回值 | bool | 成功True |
## sharedmap
### ```__init__```
通过给定的名字获得一个共享内存字典,该字典数据必须是由上面的```rbtree```对象通过```share```方法写入的。
| 参数 | 类型 | 说明 |
| - | - | - |
| name | str | |
### ```get```
| 参数 | 类型 | 说明 |
| - | - | - |
| key | str | |
| 返回值 | str | |
# 实现原理
avl树是完美平衡树,在内存中可以用连续的内存块表示,同时avl树的读取操作并不需要在其内存结构中写入任何辅助的信息。avl树的插入操作成本非常高(用给定的有序定长数组构造avl树很快),但读取速度非常快。红黑树插入方便。
共享内存中的数据修改需要在多个不同的进程中用锁来控制,是比较困难的,所以本文的方案是禁用了共享字典的持续写入能力。用红黑树初始化一个字典,然后制作成avl树快照供后续读取。一个共享内存字典的生命周期内,只允许一次性的写入操作,因此具有极好的无锁并发读取特性。
但缺点也是存在的,想要更新共享字典中的数据,需要用红黑树加载所有数据修改后再全量写入共享内存。而且重新写入后,已经被加载的共享字典变成了那些进程的私有数据脱离了共享内存,占用一块内存不说,还不会更新,只能通过销毁对象重新创建或者重启进程来更新数据。可以说修改成本是非常非常高的。
Raw data
{
"_id": null,
"home_page": "",
"name": "sharedmap",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "sharedmap,sharememory,rbtree,avltree",
"author": "lyramilk",
"author_email": "lyramilk@qq.com",
"download_url": "https://files.pythonhosted.org/packages/f5/0b/1fa9730c809875cbb7d4eb6048ebba3e5112bc7f866ba788417528605d3f/sharedmap-1.0.6.tar.gz",
"platform": null,
"description": "# \u5b89\u88c5\n\u8865\u5145\u4e0a\u4f20\u5230pypi\u4e86\uff0c\u4f20\u7684sdist\uff0c\u6240\u4ee5\u4e5f\u652f\u6301python2\u3002\n```\npip3 install sharedmap\n```\n\n\n\n# \u793a\u4f8b\n```\nimport sharedmap\n\ndef t1():\n\twmap = sharedmap.rbtree();\n\twmap.set(\"aaa\",\"323\");\n\twmap.set(\"zb\",\"1233\");\n\twmap.set(\"tes\",\"32z\");\n\twmap.set(\"\u7ea2\",\"32\u662f\");\n\tprint(wmap.get(\"tes\"));\n\twmap.share(\"test:3325\",force=True);\n\n\nprint(\"\u6d4b\u8bd5\u5199\u5165\");\nt1();\n\n\n\ndef t2():\n\trmap = sharedmap.sharedmap(\"test:3325\");\n\tprint(rmap.get(\"\u7ea2\"));\n\nprint(\"\u6d4b\u8bd5\u8bfb\u53d6\");\nt2();\n```\n\n# \u5de5\u5177\u7c7b\n## rbtree\n\u8fd9\u4e2a\u7c7b\u7528c++\u4ee3\u7801\u6a21\u62df\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u5b57\u7b26\u4e32\u5b57\u5178\u3002\u8be5\u5b57\u5178\u53ef\u4ee5\u901a\u8fc7```share```\u65b9\u6cd5\u5411\u5171\u4eab\u5185\u5b58\u5199\u5165\u4e00\u4e2a```sharedmap```\u3002\n\n### ```set```\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| key | str | |\n| val | str | |\n| \u8fd4\u56de\u503c | bool | \u6210\u529fTrue |\n\n\u8be5\u65b9\u6cd5\u5931\u8d25\u7684\u65f6\u5019\u4f1a\u629b\u51fa\u5f02\u5e38\u3002\n\n### ```get```\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| key | str | |\n| \u8fd4\u56de\u503c | str | |\n\n\n### ```share```\n\n\u628a\u5b57\u5178\u5f53\u524d\u72b6\u6001\u5236\u4f5c\u6210\u4e00\u4e2a\u5feb\u7167(\u57fa\u4e8e\u7d22\u5f15\u7684\u5185\u5b58\u6c60\u548cavl\u6811)\u4fdd\u5b58\u5230\u5171\u4eab\u5185\u5b58\u4e2d\uff0c\u8fd9\u4e2a\u5feb\u7167\u53ef\u4ee5\u901a\u8fc7```sharedmap```\u8bfb\u53d6\u3002\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| name | str | \u5171\u4eab\u5b57\u5178\u7684\u540d\u5b57\uff0csharedmap\u5728\u521d\u59cb\u5316\u7684\u65f6\u5019\u4f1a\u7528\u5230 |\n| force | bool | \u5982\u679c\u8be5\u540d\u5b57\u7684\u5171\u4eab\u5b57\u5178\u5df2\u7ecf\u5b58\u5728\uff0c\u662f\u5426\u5220\u6389\u65e7\u7684\u91cd\u5efa\u3002 |\n| \u8fd4\u56de\u503c | bool | \u6210\u529fTrue |\n\n\u8be5\u65b9\u6cd5\u5931\u8d25\u7684\u65f6\u5019\u4f1a\u629b\u51fa\u5f02\u5e38\u3002\n\n### ```dump```\n\n\u628a\u5b57\u5178\u5f53\u524d\u72b6\u6001\u5236\u4f5c\u6210\u4e00\u4e2a\u5feb\u7167\u8fd4\u56de\u6210```bytes```\u8fd9\u4e2a\u4e8c\u8fdb\u5236\u6570\u7ec4\u5176\u5b9e\u5c31\u662f```sharedmap```\u7684\u5185\u5b58\u7ed3\u6784\u3002(\u76ee\u524d\u6ca1\u63d0\u4f9b\u8bfb\u53d6\u7684\u529e\u6cd5\uff0c\u6240\u4ee5\u8fd9\u4e2a\u65b9\u6cd5\u5176\u5b9e\u6ca1\u4ec0\u4e48\u610f\u4e49)\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| name | str | \u5171\u4eab\u5b57\u5178\u7684\u540d\u5b57\uff0csharedmap\u5728\u521d\u59cb\u5316\u7684\u65f6\u5019\u4f1a\u7528\u5230 |\n| \u8fd4\u56de\u503c | bytes | \u6210\u529fTrue |\n\n### ```remove```\n\n\u8fd9\u662f\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\uff0c\u7528\u6237\u5220\u9664\u7531```share```\u65b9\u6cd5\u6784\u9020\u7684\u5171\u4eab\u5185\u5b58```sharedmap```\uff0c\u5220\u9664\u64cd\u4f5c\u4e0d\u8981\u6c42\u548c\u5199\u5165\u64cd\u4f5c\u5728\u540c\u4e00\u4e2a\u8fdb\u7a0b\u4e2d\u3002\u5220\u9664\u540e\uff0c\u5df2\u7ecf\u83b7\u53d6\u7684```sharedmap```\u4f9d\u7136\u6709\u6548\uff0c\u65e0\u6cd5\u901a\u8fc7\u8be5\u540d\u5b57\u83b7\u5f97```sharedmap```\u5bf9\u8c61\u3002\u5220\u9664\u540e\u53ef\u4ee5\u901a\u8fc7```share```\u65b9\u6cd5\u5efa\u7acb\u65b0\u7684```sharedmap```\u3002\u66f4\u591a\u7ec6\u8282\u548c\u6e05\u7406\u5185\u5b58\u7684\u65f6\u673a\u53c2\u8003\u5171\u4eab\u5185\u5b58\u7684\u539f\u7406\u3002\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| name | str | \u5171\u4eab\u5b57\u5178\u7684\u540d\u5b57\uff0csharedmap\u5728\u521d\u59cb\u5316\u7684\u65f6\u5019\u4f1a\u7528\u5230 |\n| \u8fd4\u56de\u503c | bool | \u6210\u529fTrue |\n\n\n## sharedmap\n\n\n### ```__init__```\n\u901a\u8fc7\u7ed9\u5b9a\u7684\u540d\u5b57\u83b7\u5f97\u4e00\u4e2a\u5171\u4eab\u5185\u5b58\u5b57\u5178\uff0c\u8be5\u5b57\u5178\u6570\u636e\u5fc5\u987b\u662f\u7531\u4e0a\u9762\u7684```rbtree```\u5bf9\u8c61\u901a\u8fc7```share```\u65b9\u6cd5\u5199\u5165\u7684\u3002\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| name | str | |\n\n\n\n### ```get```\n\n| \u53c2\u6570 | \u7c7b\u578b | \u8bf4\u660e |\n| - | - | - |\n| key | str | |\n| \u8fd4\u56de\u503c | str | |\n\n\n# \u5b9e\u73b0\u539f\u7406\navl\u6811\u662f\u5b8c\u7f8e\u5e73\u8861\u6811\uff0c\u5728\u5185\u5b58\u4e2d\u53ef\u4ee5\u7528\u8fde\u7eed\u7684\u5185\u5b58\u5757\u8868\u793a\uff0c\u540c\u65f6avl\u6811\u7684\u8bfb\u53d6\u64cd\u4f5c\u5e76\u4e0d\u9700\u8981\u5728\u5176\u5185\u5b58\u7ed3\u6784\u4e2d\u5199\u5165\u4efb\u4f55\u8f85\u52a9\u7684\u4fe1\u606f\u3002avl\u6811\u7684\u63d2\u5165\u64cd\u4f5c\u6210\u672c\u975e\u5e38\u9ad8\uff08\u7528\u7ed9\u5b9a\u7684\u6709\u5e8f\u5b9a\u957f\u6570\u7ec4\u6784\u9020avl\u6811\u5f88\u5feb\uff09\uff0c\u4f46\u8bfb\u53d6\u901f\u5ea6\u975e\u5e38\u5feb\u3002\u7ea2\u9ed1\u6811\u63d2\u5165\u65b9\u4fbf\u3002\n\n\u5171\u4eab\u5185\u5b58\u4e2d\u7684\u6570\u636e\u4fee\u6539\u9700\u8981\u5728\u591a\u4e2a\u4e0d\u540c\u7684\u8fdb\u7a0b\u4e2d\u7528\u9501\u6765\u63a7\u5236\uff0c\u662f\u6bd4\u8f83\u56f0\u96be\u7684\uff0c\u6240\u4ee5\u672c\u6587\u7684\u65b9\u6848\u662f\u7981\u7528\u4e86\u5171\u4eab\u5b57\u5178\u7684\u6301\u7eed\u5199\u5165\u80fd\u529b\u3002\u7528\u7ea2\u9ed1\u6811\u521d\u59cb\u5316\u4e00\u4e2a\u5b57\u5178\uff0c\u7136\u540e\u5236\u4f5c\u6210avl\u6811\u5feb\u7167\u4f9b\u540e\u7eed\u8bfb\u53d6\u3002\u4e00\u4e2a\u5171\u4eab\u5185\u5b58\u5b57\u5178\u7684\u751f\u547d\u5468\u671f\u5185\uff0c\u53ea\u5141\u8bb8\u4e00\u6b21\u6027\u7684\u5199\u5165\u64cd\u4f5c\uff0c\u56e0\u6b64\u5177\u6709\u6781\u597d\u7684\u65e0\u9501\u5e76\u53d1\u8bfb\u53d6\u7279\u6027\u3002\n\n\u4f46\u7f3a\u70b9\u4e5f\u662f\u5b58\u5728\u7684\uff0c\u60f3\u8981\u66f4\u65b0\u5171\u4eab\u5b57\u5178\u4e2d\u7684\u6570\u636e\uff0c\u9700\u8981\u7528\u7ea2\u9ed1\u6811\u52a0\u8f7d\u6240\u6709\u6570\u636e\u4fee\u6539\u540e\u518d\u5168\u91cf\u5199\u5165\u5171\u4eab\u5185\u5b58\u3002\u800c\u4e14\u91cd\u65b0\u5199\u5165\u540e\uff0c\u5df2\u7ecf\u88ab\u52a0\u8f7d\u7684\u5171\u4eab\u5b57\u5178\u53d8\u6210\u4e86\u90a3\u4e9b\u8fdb\u7a0b\u7684\u79c1\u6709\u6570\u636e\u8131\u79bb\u4e86\u5171\u4eab\u5185\u5b58\uff0c\u5360\u7528\u4e00\u5757\u5185\u5b58\u4e0d\u8bf4\uff0c\u8fd8\u4e0d\u4f1a\u66f4\u65b0\uff0c\u53ea\u80fd\u901a\u8fc7\u9500\u6bc1\u5bf9\u8c61\u91cd\u65b0\u521b\u5efa\u6216\u8005\u91cd\u542f\u8fdb\u7a0b\u6765\u66f4\u65b0\u6570\u636e\u3002\u53ef\u4ee5\u8bf4\u4fee\u6539\u6210\u672c\u662f\u975e\u5e38\u975e\u5e38\u9ad8\u7684\u3002\n\n\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "sharedmap",
"version": "1.0.6",
"project_urls": null,
"split_keywords": [
"sharedmap",
"sharememory",
"rbtree",
"avltree"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f50b1fa9730c809875cbb7d4eb6048ebba3e5112bc7f866ba788417528605d3f",
"md5": "9e772b1596774c6b39b5a9690cd6781d",
"sha256": "5d584ddb22bf261fd3c7db45113dcb9bc87e186e9cd8c7e2d79313d900afa029"
},
"downloads": -1,
"filename": "sharedmap-1.0.6.tar.gz",
"has_sig": false,
"md5_digest": "9e772b1596774c6b39b5a9690cd6781d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22098,
"upload_time": "2023-05-26T12:37:31",
"upload_time_iso_8601": "2023-05-26T12:37:31.358312Z",
"url": "https://files.pythonhosted.org/packages/f5/0b/1fa9730c809875cbb7d4eb6048ebba3e5112bc7f866ba788417528605d3f/sharedmap-1.0.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-26 12:37:31",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "sharedmap"
}