<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<STYLE type=text/css> <!--@import url(scrollbar.css); --></STYLE>

<META content="text/html; charset=utf-8" http-equiv=Content-Type>
<STYLE>                   body{FONT-SIZE:12pt; FONT-FAMILY:宋体,serif;}         </STYLE>

<META name=GENERATOR content="MSHTML 9.00.8112.16450"><BASE 
target=_blank></HEAD>
<BODY 
style="LINE-HEIGHT: 1.3; BORDER-RIGHT-WIDTH: 0px; MARGIN: 12px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" 
marginheight="0" marginwidth="0">
<DIV><FONT color=#000000 size=3 face=Verdana>Thank you very 
much. </FONT><FONT color=#000000 size=3 face=Verdana>I have done some simple 
test, the results showed it seemed less efficient...</FONT></DIV>
<DIV><FONT size=3 face=Verdana></FONT> </DIV>
<DIV><FONT color=#000000 size=3 face=Verdana> I call the funtion 
"c.startService" before uploading a file, and I put off calling 
"uploader.upload(uploadable)" to make sure Server is finished starting 
up...</FONT></DIV>
<DIV><FONT size=3 face=Verdana></FONT> </DIV>
<DIV><FONT size=3 face=Verdana>It seems can work right, but there is an need to 
do more work to optimize it.</FONT></DIV>
<DIV><FONT size=3 face=Verdana></FONT> </DIV>
<DIV> </DIV>
<DIV align=left><FONT color=#c0c0c0 size=2 face=Verdana>2012-11-07</FONT></DIV>
<DIV align=left><FONT size=2 face=Verdana>
<HR style="WIDTH: 122px; HEIGHT: 2px" id=SignNameHR align=left SIZE=2>
</FONT></DIV>
<DIV align=left><FONT color=#c0c0c0 size=2 face=Verdana><SPAN id=_FlashSignName>
<STYLE type=text/css>
body {
        font-size:12.1pt; font-family:simsun,serif;
}
</STYLE>
<!-- flashmail style begin -->
<STYLE type=text/css> <!--@import url(C:\Program Files\Netease\网易闪电邮\\data\scrollbar.css); -->
blockquote {
        margin-top:0; margin-bottom:0; margin-left:2em;
}
body {
        padding:0; margin:0;
}
</STYLE>
<BASE target=_blank><!-- flashmail style end -->
<META name=GENERATOR content="MSHTML 9.00.8112.16443">
<DIV><FONT face=Verdana>Regards,</FONT></DIV>
<DIV><FONT face=Verdana>han zheng</FONT></DIV></STATIONERY></SPAN></FONT></DIV>
<DIV><FONT size=2 face=Verdana>
<HR>
</FONT></DIV>
<DIV><FONT size=2 face=Verdana><STRONG>发件人:</STRONG>Zooko 
Wilcox-O'Hearn</FONT></DIV>
<DIV><FONT size=2 
face=Verdana><STRONG>发送时间:</STRONG>2012-11-06 00:11</FONT></DIV>
<DIV><FONT size=2 face=Verdana><STRONG>主题:</STRONG>Re: [tahoe-dev] 回复: Re: 
hello</FONT></DIV>
<DIV><FONT size=2 face=Verdana><STRONG>收件人:</STRONG>"Tahoe-LAFS 
development"<tahoe-dev@tahoe-lafs.org></FONT></DIV>
<DIV><FONT size=2 face=Verdana><STRONG>抄送:</STRONG></FONT></DIV>
<DIV><FONT size=2 face=Verdana></FONT> </DIV>
<DIV><FONT size=2 face=Verdana>
<DIV>Dear Han Zheng: </DIV>
<DIV> </DIV>
<DIV>I'm glad you are learning how to write Python code to extend the </DIV>
<DIV>Tahoe-LAFS gateway. </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>On Fri, Nov 2, 2012 at 9:29 PM, han zheng <z.han0903@gmail.com> wrote: </DIV>
<DIV>> if __name__ == "__main__": </DIV>
<DIV>>     c = client.Client("/home/nick/.tahoe") </DIV>
<DIV>>     uploader = c.getServiceNamed("uploader") </DIV>
<DIV>>     uploadable = FileName("/home/nick/test.tar.gz",None) </DIV>
<DIV>>     d = uploader.upload(uploadable) </DIV>
<DIV>>     d.addCallback(printSuccess) </DIV>
<DIV>>     d.addErrback(printError) </DIV>
<DIV>> </DIV>
<DIV>>     reactor.callLater(10,reactor.stop) </DIV>
<DIV>>     reactor.run() </DIV>
<DIV>> ---------------------------------------------------------------------------- </DIV>
<DIV>> </DIV>
<DIV>> When I ran "python test.py"(the file located in "/home/nick/.tahoe"), there </DIV>
<DIV>> was an Failure instance like this: "client gave us zero servers" </DIV>
<DIV>> </DIV>
<DIV>> Should I do some initialization work? and how? </DIV>
<DIV> </DIV>
<DIV>I'm not sure, but I think the key might be that you need to invoke </DIV>
<DIV>"startService" on the client object: </DIV>
<DIV> </DIV>
<DIV>https://tahoe-lafs.org/trac/tahoe-lafs/browser/git/src/allmydata/node.py?annotate=blame&rev=26d3869076f02351a821a3e4dd7049fd234f6bb6#L287 </DIV>
<DIV> </DIV>
<DIV>It looks like there isn't a way for your Python code to tell *when* </DIV>
<DIV>the service is finished starting up. Perhaps you'll need to extend the </DIV>
<DIV>current code to return a Deferred from the startService method and </DIV>
<DIV>trigger that Deferred once it has done everything it needs to do. Then </DIV>
<DIV>your new code that wants to use a started-up client can attach a </DIV>
<DIV>callback to that Deferred to do whatever your new code wants to do </DIV>
<DIV>after the client is ready. </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>> I ran "tahoe start" before I ran "test.py" </DIV>
<DIV> </DIV>
<DIV>The shell command "tahoe start" won't help! That starts a separate </DIV>
<DIV>operating system process in which Python runs and in that Python </DIV>
<DIV>interpreter, the tahoe "client.Client" object gets constructed and </DIV>
<DIV>started. Then when you run "python test.py", another, separate </DIV>
<DIV>operating system process is created with its own Python interpreter </DIV>
<DIV>and its own "client.Client" object. The two processes have completely </DIV>
<DIV>separate Python interpreters, so what Python code you run in one will </DIV>
<DIV>not have any direct effect on the other. </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>> If I only use tahoe as backup system, I think uploading a file directly to the cloud is more efficient </DIV>
<DIV> </DIV>
<DIV>Hm, you know what? I was about to write that I think you're wrong — </DIV>
<DIV>that uploading the file by "tahoe put" through the web API will be </DIV>
<DIV>just as efficient as your Python code that uploads a file from within </DIV>
<DIV>the client. But, maybe it *will* be different. The webapi has to store </DIV>
<DIV>a copy of the uploaded file in temp space on disk before beginning to </DIV>
<DIV>upload it. The inside-the-Python-interpreter code would instead just </DIV>
<DIV>make a pre-pass over the file, reading all of its contents, before </DIV>
<DIV>beginning to upload it. </DIV>
<DIV> </DIV>
<DIV>In any case, you should measure how much difference it makes in </DIV>
<DIV>performance. It might be a big difference, a little difference, or no </DIV>
<DIV>difference. Your in-the-Python-interpreter code might even be *less* </DIV>
<DIV>efficient than code that goes through the webapi. Measure! </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>Regards, </DIV>
<DIV> </DIV>
<DIV>Zooko </DIV>
<DIV>_______________________________________________ </DIV>
<DIV>tahoe-dev mailing list </DIV>
<DIV>tahoe-dev@tahoe-lafs.org </DIV>
<DIV>https://tahoe-lafs.org/cgi-bin/mailman/listinfo/tahoe-dev </DIV></FONT></DIV></BODY></HTML>