- 论坛徽章:
- 0
|
"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) |
|