@joe - fire/forget - you can just skip the fetcher.wait() call (which call AsyncAPIProxy.wait). I'm not sure of you would need a valid callback but even if you did it could be a simple stub that does nothing.
@david - have you made this work with datastore calls yet? having some issues trying to figure out how to set pbrequest/pbresponse variables cheers brian On Mar 16, 12:05 pm, Joe Bowman <bowman.jos...@gmail.com> wrote: > Wow that's great. The SDK might be problematic for you, as it appears > to be very single threaded, I know for a fact it can't reply to > requests to itself. > > Out of curiosity, are you still using base urlfetch, or is it your own > creation? While when Google releases their scheduled tasks > functionality it will be less of an issue, if your solution had the > ability to fire off urlfetch calls and not wait for a response, it > could be a perfect fit for the gaeutilities cron utility. > > Currently it grabs a list of tasks it's supposed to run on request, > sets a timestamp, runs one, the compares now() to the timestamp and if > the timedelta is more than 1 second, stops running tasks and finishes > the request. It already appears your project would be perfect for > running all necessary tasks at once, and the MIT License I believe is > compatible with the BSD license I've released gaeutilities, so would > you have any personal objection to me including it in gaeutilities at > some point, with proper attribution of course? > > If you haven't see that project, it's url ishttp://gaeutilities.appspot.com/ > > On Mar 16, 11:03 am, David Wilson <d...@botanicus.net> wrote: > > > Joe, > > > I've only tested it in production. ;) > > > The code should work serially on the SDK, but I haven't tried yet. > > > David. > > > 2009/3/16 Joe Bowman <bowman.jos...@gmail.com>: > > > > Does the batch fetching working on live appengine applications, or > > > only on the SDK? > > > > On Mar 16, 10:19 am, David Wilson <d...@botanicus.net> wrote: > > >> I have no idea how definitive this is, but literally it means wall > > >> clock time seems to be how CPU cost is measured. I guess this makes > > >> sense for a few different reasons. > > > >> I found some internal function > > >> "google3.apphosting.runtime._apphosting_runtime___python__apiproxy.get_requ > > >> est_cpu_usage" > > >> with the docstring: > > > >> Returns the number of megacycles used so far by this request. > > >> Does not include CPU used by API calls. > > > >> Calling it, then running time.sleep(5), then calling it again, > > >> indicates thousands of megacycles used, yet in real terms the CPU was > > >> probably doing nothing. I guess Datastore CPU, etc., is added on top > > >> of this, but it seems to suggest to me that if you can drastically > > >> reduce request time, quota usage should drop too. > > > >> I have yet to do any kind of rough measurements of Datastore CPU, so > > >> I'm not sure how correct this all is. > > > >> David. > > > >> - One of the guys on IRC suggested this means that per-request cost > > >> is scaled during peak usage (and thus internal services running > > >> slower). > > > >> 2009/3/16 peterk <peter.ke...@gmail.com>: > > > >> > A couple of questions re. CPU usage.. > > > >> > "CPU time quota appears to be calculated based on literal time" > > > >> > Can you clarify what you mean here? I presume each async request eats > > >> > into your CPU budget. But you say: > > > >> > "since you can burn a whole lot more AppEngine CPU more cheaply using > > >> > the async api" > > > >> > Can you clarify how that's the case? > > > >> > I would guess as long as you're being billed for the cpu-ms spent in > > >> > your asynchronous calls, Google would let you hang yourself with them > > >> > when it comes to billing.. :) so I presume they'd let you squeeze in > > >> > as many as your original request, and its limit, will allow for? > > > >> > Thanks again. > > > >> > On Mar 16, 2:00 pm, David Wilson <d...@botanicus.net> wrote: > > >> >> It's completely undocumented (at this stage, anyway), but definitely > > >> >> seems to work. A few notes I've come gathered: > > > >> >> - CPU time quota appears to be calculated based on literal time, > > >> >> rather than e.g. the UNIX concept of "time spent in running state". > > > >> >> - I can fetch 100 URLs in 1.3 seconds from a machine colocated in > > >> >> Germany using the asynchronous API. I can't begin to imagine how slow > > >> >> (and therefore expensive in monetary terms) this would be using the > > >> >> standard API. > > > >> >> - The user-specified callback function appears to be invoked in a > > >> >> separate thread; the RPC isn't "complete" until this callback > > >> >> completes. The callback thread is still subject to the request > > >> >> deadline. > > > >> >> - It's a standard interface, and seems to have no parallel > > >> >> restrictions at least for urlfetch and Datastore. However, I imagine > > >> >> that it's possible restrictions may be placed here at some later > > >> >> stage, since you can burn a whole lot more AppEngine CPU more cheaply > > >> >> using the async api. > > > >> >> - It's "standard" only insomuch as you have to fiddle with > > >> >> AppEngine-internal protocolbuffer definitions for each service type. > > >> >> This mostly means copy-pasting the standard sync call code from the > > >> >> SDK, and hacking it to use pubsubhubub's proxy code. > > > >> >> Per the last point, you might be better waiting for an officially > > >> >> sanctioned API for doing this, albeit I doubt the protocolbuffer > > >> >> definitions change all that often. > > > >> >> Thanks for Brett Slatkin & co. for doing the digging required to get > > >> >> the async stuff working! :) > > > >> >> David. > > > >> >> 2009/3/16 peterk <peter.ke...@gmail.com>: > > > >> >> > Very neat.. Thank you. > > > >> >> > Just to clarify, can we use this for all API calls? Datastore too? I > > >> >> > didn't look very closely at the async proxy in pubsubhubub.. > > > >> >> > Asynchronous calls available on all apis might give a lot to chew > > >> >> > on.. :) It's been a while since I've worked with async function > > >> >> > calls > > >> >> > or threading, might have to dig up some old notes to see where I > > >> >> > could > > >> >> > extract gains from it in my app. Some common cases might be worth > > >> >> > the > > >> >> > community documenting for all to benefit from, too. > > > >> >> > On Mar 16, 1:26 pm, David Wilson <d...@botanicus.net> wrote: > > >> >> >> I've created a Google Code project to contain some batch utilities > > >> >> >> I'm > > >> >> >> working on, based on async_apiproxy.py from pubsubhubbub[0]. The > > >> >> >> project currently contains just a modified async_apiproxy.py that > > >> >> >> doesn't require dummy google3 modules on the local machine, and a > > >> >> >> megafetch.py, for batch-fetching URLs. > > > >> >> >> http://code.google.com/p/appengine-async-tools/ > > > >> >> >> David > > > >> >> >> [0]http://code.google.com/p/pubsubhubbub/source/browse/trunk/hub/async_a... > > > >> >> >> -- > > >> >> >> It is better to be wrong than to be vague. > > >> >> >> — Freeman Dyson > > > >> >> -- > > >> >> It is better to be wrong than to be vague. > > >> >> — Freeman Dyson > > > >> -- > > >> It is better to be wrong than to be vague. > > >> — Freeman Dyson > > > -- > > It is better to be wrong than to be vague. > > — Freeman Dyson --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~----------~----~----~----~------~----~------~--~---