- 论坛徽章:
- 0
|
自己封装了最新libmemcached中的libmemcacheutil的libmemcache_pool连接池到python,还是不行
看来是python的GIL导致的问题,线程无法真正并发。
root@ubuntu:/home/ubuntu# python benchmark.py
Testing single thread ...
[6.0042738914489746]
Testing muti thread ...
[60.949532032012939]
Testing thread pool ...
[63.305776834487915]
Testing thread and single conn ...
[58.841603994369507]
root@ubuntu:/home/ubuntu# cat benchmark.py
import cmemcached as pylibmc
import threading
test_servers = ["127.0.0.1:11211"]
def simple_set(mc):
mc.set("foo", "fooAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")
mc.set("bar", "barAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")
def simple_get(mc):
mc.get("foo")
mc.get("bar")
def test_single_thread(n):
mc = pylibmc.Client(test_servers)
for x in xrange(n):
simple_set(mc)
simple_get(mc)
#mc.disconnect_all()
def __test(mc,n):
for x in xrange(n):
simple_set(mc)
simple_get(mc)
def test_pool_thread(tn,n):
mc = pylibmc.Client(test_servers)
mc.entry_pool_mode(10,10)
threads=[]
for x in xrange(tn):
t=threading.Thread(target=__test,args=(mc,n))
threads.append(t)
for x in xrange(tn):
threads[x].start()
for x in xrange(tn):
threads[x].join()
def test_muti_thread(tn,n):
mcs=[]
for x in xrange(tn):
mc = pylibmc.Client(test_servers)
mcs.append(mc)
threads=[]
for x in xrange(tn):
t=threading.Thread(target=__test,args=(mcs[x],n))
threads.append(t)
for x in xrange(tn):
threads[x].start()
for x in xrange(tn):
threads[x].join()
def test_single_conn_thread(tn,n):
mc = pylibmc.Client(test_servers)
threads=[]
for x in xrange(tn):
t=threading.Thread(target=__test,args=(mc,n))
threads.append(t)
for x in xrange(tn):
threads[x].start()
for x in xrange(tn):
threads[x].join()
if __name__ == '__main__':
import timeit
print "Testing single thread ..."
t=timeit.Timer('b.test_single_thread(5000);','import benchmark as b' )
print t.repeat(1,1)
print "Testing muti thread ..."
t=timeit.Timer('b.test_muti_thread(10,5000);','import benchmark as b' )
print t.repeat(1,1)
print "Testing thread pool ..."
t=timeit.Timer('b.test_pool_thread(10,5000);','import benchmark as b' )
print t.repeat(1,1)
print "Testing thread and single conn ..."
t=timeit.Timer('b.test_single_conn_thread(10,5000);','import benchmark as b' )
print t.repeat(1,1)
对python-libmemcached 0.13.1进行了修改,封装了libmemcache的pool功能,修改后diff结果如下:
ubuntu@ubuntu:~/a$ diff python-libmemcached-0.13.1/cmemcached.pyx ../python-libmemcached-0.13.1/cmemcached.pyx
144a145,152
> cdef extern from "memcached_pool.h":
> struct memcached_pool_st:
> pass
> memcached_pool_st *memcached_pool_create(memcached_st* ptr, uint32_t initial,uint32_t max)
> memcached_st* memcached_pool_destroy(memcached_pool_st* ptr)
> memcached_st* memcached_pool_pop(memcached_pool_st* ptr, int block, memcached_return* rc)
> memcached_return memcached_pool_push(memcached_pool_st* ptr, memcached_st* mmc)
>
198a207
> cdef memcached_pool_st * pool
216a226
> self.pool = NULL
237a248,257
> def entry_pool_mode(self,s,max):
> if not self.pool :
> return -1
> if s <= 1 :
> return -1
> if max <=s :
> max = s
> self.pool=memcached_pool_create(self.mc, s,max)
> return 1
>
251a272,273
> if self.pool:
> memcached_pool_destroy(self.pool)
258a281
> cdef memcached_st * mc
274c297,302
< retval = memcached_set(self.mc, c_key, key_len, c_val, bytes, time, flags)
---
> if self.pool :
> mc=memcached_pool_pop(self.pool, 1, &retval)
> retval = memcached_set(mc, c_key, key_len, c_val, bytes, time, flags)
> memcached_pool_push(self.pool, mc)
> else:
> retval = memcached_set(self.mc, c_key, key_len, c_val, bytes, time, flags)
339a368
> cdef memcached_st * mc
346c375,381
< c_val = memcached_get(self.mc, c_key, key_len, &bytes, &flags, &rc)
---
>
> if self.pool :
> mc=memcached_pool_pop(self.pool, 1, &rc)
> c_val = memcached_get(mc, c_key, key_len, &bytes, &flags, &rc)
> memcached_pool_push(self.pool, mc)
> else:
> c_val = memcached_get(self.mc, c_key, key_len, &bytes, &flags, &rc)
ubuntu@ubuntu:~/a$ diff python-libmemcached-0.13.1/setup.py ../python-libmemcached-0.13.1/setup.py
14c14
< libraries=['memcached'],
---
> libraries=['memcached','memcachedutil'], |
|