<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sparkle&#039;s Workshop &#187; thread</title>
	<atom:link href="http://weavesky.com/tag/thread/feed/" rel="self" type="application/rss+xml" />
	<link>http://weavesky.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Dec 2011 08:14:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>python-memcached是不是线程安全的</title>
		<link>http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/</link>
		<comments>http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 07:16:45 +0000</pubDate>
		<dc:creator>Sparkle</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">http://weavesky.com/?p=553</guid>
		<description><![CDATA[答案是肯定的，前提你在使用Python 2.4+和python-memcached 1.36+ 为什么我们需要线程安全的memcached client，因为我们的实际应用一般是多线程的模型，例如cherrypy、twisted，如果python-memcached不是线程安全的话，引起的问题不仅仅是并发修改共享变量这么简单，是外部socket链接的数据流的混乱 python-memcached怎么实现线程安全的呢？查看源代码看到 try: # Only exists in Python 2.4+ from threading import local except ImportError: # TODO: add the pure-python local implementation class local&#40;object&#41;: pass &#160; &#160; class Client&#40;local&#41;: 很取巧的让Client类继承threading.local，也就是Client里面的每一个属性都是跟当前线程绑定的。实现虽然不太优雅，但是很实在 但是别以为这样就可以随便在线程里面用python-memcached了，因为这种thread local的做法，你的应用必须要使用thread pool的模式，而不能不停创建销毁thread，因为每一个新线程的创建，对于就会使用一个全新的Client，也就是一个全新的socket链接，如果不停打开创建销毁thread的话，就会导致不停的创建销毁socket链接，导致性能大量下降。幸好，无论是cherrypy还是twisted，都是使用了thread pool的模式 参考资料： http://code.djangoproject.com/ticket/3701 &#8230; <a class="more-link" href="http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>答案是肯定的，前提你在使用Python 2.4+和python-memcached 1.36+<br />
为什么我们需要线程安全的memcached client，因为我们的实际应用一般是多线程的模型，例如cherrypy、twisted，如果python-memcached不是线程安全的话，引起的问题不仅仅是并发修改共享变量这么简单，是外部socket链接的数据流的混乱<br />
python-memcached怎么实现线程安全的呢？查看源代码看到</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #808080; font-style: italic;"># Only exists in Python 2.4+</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">threading</span> <span style="color: #ff7700;font-weight:bold;">import</span> local
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ImportError</span>:
    <span style="color: #808080; font-style: italic;"># TODO:  add the pure-python local implementation</span>
    <span style="color: #ff7700;font-weight:bold;">class</span> local<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Client<span style="color: black;">&#40;</span>local<span style="color: black;">&#41;</span>:</pre></div></div>

<p>很取巧的让Client类继承threading.local，也就是Client里面的每一个属性都是跟当前线程绑定的。实现虽然不太优雅，但是很实在<br />
但是别以为这样就可以随便在线程里面用python-memcached了，因为这种thread local的做法，你的应用必须要使用thread pool的模式，而不能不停创建销毁thread，因为每一个新线程的创建，对于就会使用一个全新的Client，也就是一个全新的socket链接，如果不停打开创建销毁thread的话，就会导致不停的创建销毁socket链接，导致性能大量下降。幸好，无论是cherrypy还是twisted，都是使用了thread pool的模式</p>
<p>参考资料：<br />
<a href="http://code.djangoproject.com/ticket/3701">http://code.djangoproject.com/ticket/3701</a><br />
<a href="http://lists.danga.com/pipermail/memcached/2007-June/004482.html">http://lists.danga.com/pipermail/memcached/2007-June/004482.html</a></p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li><a href="http://weavesky.com/2009/05/15/python-memcached-lib-in-production/" title="python在生产环境可选的memcached lib">python在生产环境可选的memcached lib</a></li><li><a href="http://weavesky.com/2009/02/14/is-python-cmemcache-threadsafe/" title="python cmemcache是不是线程安全的">python cmemcache是不是线程安全的</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

