[pypy-dev] The Work Plan Re: STM proposal funding

Andrew Francis andrewfr_ice at yahoo.com
Sun Apr 8 01:25:32 CEST 2012


Hi Armin:



________________________________
 From: Armin Rigo <arigo at tunes.org>
To: Andrew Francis <andrewfr_ice at yahoo.com> 
Cc: PyPy Developer Mailing List <pypy-dev at python.org>; "stackless at stackless.com" <stackless at stackless.com> 
Sent: Sunday, April 1, 2012 5:23 AM
Subject: Re: The Work Plan Re: [pypy-dev] STM proposal funding
 
>I'm also thinking about writing a short paper collecting things I said
>and think on various blog posts.  A kind of "position paper".  What do
>others think of this idea?

I think this is a great idea.

>This is not discussed a lot right now.  But it is apparently
>relatively easy to adapt the epoll-based Twisted reactor to use the
>'transaction' module.  (Again, this module is present in the stm-gc
>branch; look for lib_pypy/transaction.py for the interface, and
>pypy/module/transaction/* for the Python implementation on top of STM
>as exposed by RPython.) In addition, each transaction can add
 more transactions that will be
>run after it.  So if you want to play with lib_pypy/stackless.py to
>add calls to 'transaction', feel free :-)  Maybe it will show that a
>slightly different API is required from the 'transaction' module; I
>don't really know so far.

Yes I can see transaction.add() being a wrapper/decorator for tasklet creation. However I think 
that is the easy part. I'm trying to reason about the behaviour.

Starting with a simple Stackless programme:

1) All tasklets run on top of a single OS thread.
2) Tasklets do not yield until they are ready to commit, that is they do not call schedule() or block
on a channel .
3) Tasklets do not share state/ or variables are immutable ( because of #1 and #2, this isn't important)

This is a natural transaction

A more complicated but somewhat contrived scenario: 

1) tasklets are still running over a single OS thread 
2) tasklets yield
3) tasklets share state

def transactionA(account1,
 account2):
    account1.fromAccount -= 50
    if someRandomFunction():
       schedule()
    account2.toAccount += 50
   
def transactionB(account1, account2):
    t = arg.fromAccount * .1
   account1.fromAccount -= t
   if someRandomFunction():
      schedule()
   account2.toAccount += t

since the tasklets yield, this opens the door for race conditions. I need to look at how the underlying rstm module works to see how easy it would be detect conflicts amongst tasklets.

another scenario:

def transferTasklet(ch)
      ....
      while someFlag:
               toAcount, fromAccount, amount = ch.receive()
               # transaction start
                fromAccount.withdraw(amount)
                toAccount.deposit(amount)
               #transaction end

Question: without specific transaction_start() and transaction_commit() calls, how does rstm know what the start and finish of transactions are?

Cheers,
Andrew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20120407/744870af/attachment.html>


More information about the pypy-dev mailing list