免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12047 | 回复: 2
打印 上一主题 下一主题

python居然没有好用的memcache客户端! [复制链接]

论坛徽章:
0
1 [报告]
发表于 2009-08-11 11:50 |显示全部楼层
"10个线程并发读写5000次花费时间,正好是10倍,看来没有并发访问"
如果你机器是单核的,那10个线程用时10倍也是正常啊。

“自己封装了最新libmemcached中的libmemcacheutil的libmemcache_pool连接池到python,还是不行
看来是python的GIL导致的问题,线程无法真正并发。”
libmemcache_pool这个只是个连接池,又不是线程池。
python的线程是真的系统线程,试下在所有get和set前后释放和获取GIL,这样扩展模块就能真的并发,下面代码供参考:
cdef extern from "Python.h":
    ctypedef struct PyThreadState
    cdef extern PyThreadState *PyEval_SaveThread()
    cdef extern void PyEval_RestoreThread(PyThreadState*)


        def get(self, key):
                cdef char *c_key
                cdef Py_ssize_t key_len
                cdef uint32_t flags
                cdef size_t bytes
                cdef memcached_return rc
                cdef char * c_val
    cdef PyThreadState *_save

                PyString_AsStringAndSize(key, &c_key, &key_len)

                if key_len > 250:
                        return None

    _save = PyEval_SaveThread()
                c_val = memcached_get(self.mc, c_key, key_len, &bytes, &flags, &rc)
    PyEval_RestoreThread(_save)

“为什么Java一出来就支持真正的线程并发执行,而Python到3.1版还是没解决这个问题。”
我的理解java不是动态语言,实现起来当然也不同,而且python老大目的只在推进python语言的发展,对于这些难题,留给其他人解决吧(如:http://code.google.com/p/unladen-swallow/ 就想去掉GIL)

论坛徽章:
0
2 [报告]
发表于 2009-08-11 15:20 |显示全部楼层
"即使单核也不正常呀,10个线程如果能并发,那么花费的时间和单线程花费的时间应该是1样的!"
不是吧,单核cpu中,多线程也不是并发执行的,花费时间怎么是一样呢?

“libmemcache_pool中我创建10个pool,对应我创建10个线程来使用pool,这样应该是并发了吧”
libmemcache_pool是连接池,目的是为多线程提供安全、可重复使用的mc连接,和并发概念不一样吧!

根据我提供的代码做的修改运行出错:我不是很清楚那错误信息说什么,你修改的代码有没有用mc连接池?请先确认这个错误是不是其他地方引起的。另请google查下关于线程释放GIL的文章,了解这修改的作用。
我提供的这个代码,应该是正确的,是从twisted框架里面摘出来的,twisted中epoll,iocp扩展模块都是用了这释放GIL的代码。

论坛徽章:
0
3 [报告]
发表于 2009-08-12 00:51 |显示全部楼层
1、“test()函数读写memcache 500000次”
fork 两个进程和10个进程的执行时间能说明在单核CPU中是并发执行吗?我的理解,读写和IO有关,线程去到IO请求时,就会被挂起,当10个进程执行时,网络并发利用率高,所以执行会快。
两线程执行需要20秒,这个用了释放GIL的功能了吗?

2、“coredump找到原因了,已经解决了”
能说说是什么原因引起错误的吗?

3、“100线程并发下,性能提高了40%”
性能提高了,那可以说明释放GIL后,线程并发执行了吧!至于说只提供了40%,我猜可能是memached读写在整个执行过程中占的时间比例比较小,可能大部分时间耗在py脚本的执行中,看看用上psyco模块,会提高多少性能?
“但远远达不到我的要求”:你的需求是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP