<br><br><div class="gmail_quote">2009/1/26 Fabrizio Reale <span dir="ltr">&lt;<a href="mailto:fabrizio.reale@redomino.com">fabrizio.reale@redomino.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ciao,<br>
<div class="Ih2E3d">&gt; Per il momento sto testando il mio &quot;approccio alla zopectl&quot; .<br>
<br>
</div>Mi fai capire, per favore, come mai ti piace questa strada?<br>
Io l&#39;ho usata solo per debug e quindi sono interessato ad<br>
eventuali vantaggi che ho trascurato.<br>
</blockquote><div><br><br>Questo &quot;fa&quot; il task di cui ho bisogno:<br>1) crea una folder&nbsp;&nbsp; (localArgs.arg[1])<br>2) ci mette dentro un file (localArgs.arg[2])<br>3) ci mette dentro un file (localArgs.arg[3])<br>
<br>L&#39;ho testato in 10 task concorrenti con&nbsp; un desktop Dell <br>AMD Athlon(tm) 64 X2 Dual Core Processor 4800+<br>cpu MHz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 1000.000<br>cache size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 512 KB<br>1GByte di memoria<br><br>e non &quot;perde&quot; pezzi.<br>
<br>Il decorator<br>entryExit(f)<br>dovrebbe isolare la parte di gestione dell&#39;accesso a ZODB<br>dalle funzioni che fanno il lavoro<br>(mkdir, copy)<br><br>La chiarezza e&#39; tutto dire.<br>#<br>#<br>#<br>#<br><br><br>
import sys<br>import os<br>## <br>import AccessControl.SecurityManagement<br>from pprint import pprint as pprint<br>from ZODB.POSException import ConflictError<br>from Testing import makerequest<br>import transaction<br>import random<br>
import time<br>## localArgs&nbsp; is from upload-zopectl.sh<br>## really bad way to pass arguments ?<br>import localArgs <br><br><br><br>## Utility<br>def _last_node_frompath(node,path):<br>&nbsp;&nbsp;&nbsp; node = site<br>&nbsp;&nbsp;&nbsp; for attr in path.split(&#39;/&#39;):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(attr) == 0: continue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = getattr(node,attr)<br>&nbsp;&nbsp;&nbsp; return node<br><br><br><br>## Decorator<br>def entryExit(f):<br>&nbsp;&nbsp;&nbsp; def new_f(*argv,**kv):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Limit = 30<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last_t = 1.0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in range(0,Limit):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #savepoint = transaction.savepoint()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot; ** Entering&quot;, f.__name__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = f(*argv,**kv)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot; ** Exited&quot;, f.__name__<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return res <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except ConflictError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #savepoint.rollback()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j+1) == Limit: raise<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except Exception ,e :<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #savepoint.rollback()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Exception&quot;,e ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last_t = random.uniform(1.1,2.1) * last_t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot; sleep&quot;, last_t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep( last_t )<br>
&nbsp;&nbsp;&nbsp; new_f.__name__ = f.__name__<br>&nbsp;&nbsp;&nbsp; return new_f<br><br>#hmm no decorator<br>#@entryExit<br>#<br>def login_admin(app):<br>&nbsp;&nbsp;&nbsp; site = makerequest.makerequest(app)<br>&nbsp;&nbsp;&nbsp; admin = site.acl_users.getUser(&#39;admin&#39;)<br>
&nbsp;&nbsp;&nbsp; AccessControl.SecurityManagement.newSecurityManager(None,admin)<br>&nbsp;&nbsp;&nbsp; return site <br><br><br>@entryExit<br>def logout():<br>&nbsp;&nbsp;&nbsp; pass<br><br><br><br>@entryExit<br>def mkdir(site ,path=&#39;/Plone/Members/testuser&#39;,title=&#39;sample02&#39;,desc=&#39;foo&#39;):<br>
&nbsp;&nbsp;&nbsp; site._p_jar.sync()<br>&nbsp;&nbsp;&nbsp; node = site<br>&nbsp;&nbsp;&nbsp; for attr in path.split(&#39;/&#39;):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(attr) == 0: continue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = getattr(node,attr)<br>&nbsp;&nbsp;&nbsp; folder = node.invokeFactory(&quot;Folder&quot;, id=title,title=title)<br>
&nbsp;&nbsp;&nbsp; node = getattr(node,title)<br>&nbsp;&nbsp;&nbsp; node.reindexObject()<br>&nbsp;&nbsp;&nbsp; transaction.commit()<br>&nbsp;&nbsp;&nbsp; site._p_jar.sync()<br>&nbsp;&nbsp;&nbsp; return folder<br><br><br>@entryExit<br>def copy(site ,path=&#39;/Plone/Members/testuser/sample02&#39;,title=&#39;sample&#39;,src=&#39;&#39;):<br>
&nbsp;&nbsp;&nbsp; site._p_jar.sync()<br>&nbsp;&nbsp;&nbsp; folder = _last_node_frompath(site,path)<br>&nbsp;&nbsp;&nbsp; content_type = os.path.splitext(title)[1]<br>&nbsp;&nbsp;&nbsp; ## <br>&nbsp;&nbsp;&nbsp; if content_type == &#39;.pdf&#39; :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; folder.invokeFactory(&#39;File&#39;,id=title,title=title,format=&#39;application/pdf&#39;,content_type=&#39;application/pdf&#39;,)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#39;pdf&#39;<br>&nbsp;&nbsp;&nbsp; elif content_type == &#39;.swf&#39; : <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; folder.invokeFactory(&#39;File&#39;,id=title,title=title,format=&#39;application/x-shockwave-flash&#39;,content_type=&#39;application/x-shockwave-flash&#39;,)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#39;swf&#39;<br>&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; folder.invokeFactory(&#39;File&#39;,id=title,title=title,)<br>&nbsp;&nbsp;&nbsp; file1 = open(src,&#39;rb&#39;).read() &nbsp;<br>&nbsp;&nbsp;&nbsp; content = getattr(folder,title)<br>&nbsp;&nbsp;&nbsp; content.edit(file=file1)<br>
&nbsp;&nbsp;&nbsp; if content_type == &#39;.swf&#39; : <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content.setFilename(title)<br>&nbsp;&nbsp;&nbsp; content.reindexObject()<br>&nbsp;&nbsp;&nbsp; transaction.commit()<br>&nbsp;&nbsp;&nbsp; site._p_jar.sync()<br>&nbsp;&nbsp;&nbsp; return content<br><br><br>###############<br>from Zope2.Startup.run import configure <br>
configure(os.environ[&#39;CONFIG_FILE&#39;]) <br>import Zope2 <br>#<br>print &quot;TRY &quot;,localArgs.arg[1]<br>app = None <br>Limit = 30<br>last_t = 1.0<br>for j in range(0,Limit):<br>&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Try app : &quot; ,j<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app = Zope2.app()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break <br>&nbsp;&nbsp;&nbsp; except ConflictError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j+1) == Limit: raise<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br>&nbsp;&nbsp;&nbsp; except Exception ,e :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Exception&quot;,e ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last_t = random.uniform(1.1,2.1) * last_t<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot; sleep&quot;, last_t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep( last_t )<br>#<br>site = login_admin(app)<br>pprint( site.Plone )<br>basepath = &#39;/Plone/Members/testuser&#39;<br>title = localArgs.arg[1]<br>folder = mkdir(site=site, path=basepath, title=title, desc=&#39;&#39;)<br>
#<br>path=basepath+&#39;/&#39;+title<br>#<br>target_file = localArgs.arg[2]<br>dest = os.path.basename(target_file)<br>copy(site=site, path=path, title=dest,src=target_file)<br>#<br>target_file = localArgs.arg[3]<br>dest = os.path.basename(target_file)<br>
copy(site=site, path=path, title=dest,src=target_file)<br><br></div></div><br><br><br><br>-- <br>luigi<br><br>