LMPX.COM |
Home | Linux | Mysql | PHP | XML | ||
|
|
|||
From: Adam Kennedy Date: Fri Dec 9 15:34:45 2005 Subject: Re: Another feature request...
Haven't you heard? The new catch-phrase is "how does Haskell do it" :) Tim Bunce wrote: > Much like my old catch phrase was "How does ODBC do it", my new catch > phrase is "How does JDBC do it?" - but sadly that doesn't help us much here > as Java doesn't have native support for coroutines. > > So, my next new catchprase comes into play: "can it be implemented as a > subclass"? > > Meanwhile, at this point, I'll flag it as a "nice to have feature" > for us to consider a little further down the road. > > Tim. > > On Fri, Dec 09, 2005 at 02:03:49PM +1100, Adam Kennedy wrote: > >> >>Sam Vilain wrote: >> >>>On Thu, 2005-12-08 at 23:51 +0000, Tim Bunce wrote: >>> >>> >>>>On Tue, Dec 06, 2005 at 01:57:58PM +1300, Sam Vilain wrote: >>>> >>>> >>>>>How about co-operation with coroutines (See the end of S17 in >>>>>pugs/docs/AES) in DBI v2 ? >>>>> >>>>>Of course it would be heavily driver dependent :). But if there is >>>>>anything that DBI could do to be coro-safe, that would be cool. >>>> >>>>Can you expand on this with some practical examples? >>> >>> >>>How about "simple" to start off with. This one launches three queries >>>"in parallel". >>> >>> my $dbh = DBI.connect(...); >>> $dbh.begin_work; >>> my @coros; >>> for (1..3) { >>> my $coro = coro { >>> my $sth = $dbh.prepare(...); >>> $sth.execute; >>> for =$sth -> $row { >>> # process result... >>> } >>> $sth.finish; >>> }; >>> $coro.ready; >>> push @coros, $coro; >>> } >>> $_.join foreach @coros; >>> $dbh.commit; >>> >>>Now, to understand this program, remember that a coroutine is a bit like >>>a thread, but it doesn't need another process or OS thread; instead it >>>uses defined preemption points. Coroutines don't suck in practical use >>>like OS threads, because no matter how "lightweight" they are because >>>you still need to protect access to all common data structures with >>>locks, semaphores, etc. >> >>Or in Perl 6, with Software Transactional Memory. >> >> >>>The preemption points in the above are taken to be; the "join" (which >>>waits for a coro to finish), and all the $dbh and $sth operations. Of >>>course the Coroutine API is not finished so I made up .join and .ready. >>> >>>If the DBD is capable of handling multiple statements with a single >>>database connection, then it could conceivably multiplex the execution >>>of the blocks as data is returned. Otherwise, the first one's .prepare >>>or .execute will not return until the lock is freed by the $sth.finish >>>call. It is not acceptable to open separate database handles, because a >>>transaction is open. Then again, if the driver doesn't support >>>multiplexing, but supports cursors (and DBIv2 is capable of turning >>>selects into cursors when it needs to), then cursors could be used to >>>allow the parallelism. >>> >>>Does that explain much, or would something "practical" be better? >> >>I would be interested in a real example of where this is useful. I'd >>also like to know if any database in existance supports this, or plans to. >> >>As for implementation (regardless of merit), since the main idea is to >>encapsulate the larger chunks of functionality into Roles, I wouldn't >>imagine it would be that hard to implement some form of >>DBI2::Role::Cororoutine role... >> >>Adam K
| Navigate in group perl.dbi2.dev at sever nntp.perl.org | |
| Previous | Next |
| © No Copyright You are free to use Anything |
Site Maintained by PHP Developer
Powered By PHP Consultants |