The document discusses embracing concurrency for simpler code. It notes that hardware is becoming more concurrent, but most programming languages and tools treat concurrency as difficult. The Kamaelia project aims to make concurrency easy and usable for novice and advanced developers alike through fundamental control structures and messaging between components. Examples shown include using pipelines, graphlines, servers, and backplanes to build concurrent applications in a simple way.
1. Embracing
Concurrency
for Fun, Utility & Simpler Code
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home Ignite Leeds, Jan 2009
2. Embracing
Concurrency
for Fun, Utility & Simpler Code
Or “what we've learnt as a part of the
Kamaelia project about making concurrency
something that's fun and useful, and usable by
novice and advanced developers alike...
...rather than a pain in the neck”
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home Ignite Leeds, Jan 2009
3. Why? Hardware finally going
massively concurrent ...
Opportunity! .... PS3, high end servers, trickling down to desktops, laptops)
“many hands make light
work” but Viewed as Hard
... do we just have crap tools?
“And one language to in
the darkness bind them”
Problems
... can just we REALLY abandon 50 years of code for Erlang, Haskell
and occam?
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
4. Missing Something?
Fundamental Control Structures
... in imperative languages number greater than 3! (despite what you get taught...!)
Control Structure Traditional Abstraction Biggest Pain Points
Sequence Function Global Var
Selection Function Global Var
Iteration Function Global Var
Parallel Thread Shared Data
Usually Skipped Lost or duplicate update
are most common bugs
This slide raises the point that
teaching of imperative languages often
misses out concurrency as a fundamental
Michael Sparks
construct, leaving a conceptual gap
BBC R&D, http://www.kamaelia.org/Home
for most developers
5. Regarding using
concurrency, what sort
of applications are we
talking about here?
Desktop gsoc
Novice
Media
APPS trainee
3rd Party
Network
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
6. Speak 'n Write
Think backend P2P Whiteboard Programming
Simple
needed for (logo)
ER DB Modeller P2P Radio
Games
Kids
youtube/flickr Torrent
3D Systems
type systems Compose Realtime Music
Desktop gsoc
UGC Paint App
P2P Web Server
Backend
Secure “phone”
Transcoder Social Net Vis
Novice
Media ...
Shot Change
APPS
Detection MiniAxon
trainee ScriptReader
Mobile DVB MediaPreview
Reframing on Mobile
Reliable
3rd Party
Podcasts Multicast
Network
Macro
Sedna
“record
XMPP XMLDB
everything”
AWS
Email & pubsub
Web (Amazon)
Spam Qt
SMTP IRC
Serving Gtk
Greylisting
ClientSide microblogging
AIM
Pop3Proxy
Spam Tools
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
7. Core Approach:
Concurrent things with comms points
Generally send messages
Keep data private, don't share
outbox
inbox
outbox
inbox
signal
control
signal
control
...
...
...
...
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
8. But I must share data?
Use Software Transactional Memory
ie version control for variables.
1. Check out the collection
of values you wish to
work on
2. Change them
3. Check them back in
4. If conflict/clash, go
back to 1
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
9. Perspectives in APIs! (1/2)
If you have concurrency it becomes
natural to think in terms of 1st 2nd and 3rd
1st Person - I change my state
person. This affects an API's structure,
and can be vital for understanding it!
This is one we've found that makes sense
2nd Person – YOU 3rd Person –
want to me to do Bla should
something do something
(you send (I send a message)
outbox
inbox
me a message)
signal
control
...
...
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
10. Perspectives in APIs! (2/2)
If you have concurrency it becomes
natural to think in terms of 1st 2nd and 3rd
private real methods
person. This affects an API's structure,
and can be vital for understanding it!
This is one we've found that makes sense
Messages sent
Messages
to public outboxes
from public
inboxes
outbox
inbox
signal
control
Also, think
Also, think ...
...
about stdout
about stdin
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
11. Actor Systems
Distinction can be unclear,
private real methods
potential source of ambiguity*
Messages
No outbox concept
from public
Possible issues with
inboxes
rate limiting*
inbox
Hardcodes recipient
control
in the sender
...
*system dependent issue
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
12. Advantages of outboxes
No hardcoding of recipient
allows:
- Late Binding
- Dynamic rewiring
Concurrency Patterns as
outbox
inbox
Reusable Code
signal
control
... a concurrency DSL
...
...
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
13. A Core Concurrency DSL
Pipeline(A,B,C)
Graphline(A=A,B=B, C=C, linkages = {})
Tpipe(cond, C)
Seq(A,B,C), PAR(), ALT()
Backplane(“name”), PublishTo(“name”), SubscribeTo(“name”)
Carousel(...)
PureTransformer(...)
StatefulTransformer(...)
PureServer(...)
MessageDemuxer(...)
Source(*messages)
NullSink
Some of these are work in progress
– they've been identified as useful,
but not implemented as chassis, yet
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
14. Pipeline Example
Pipeline(
MyGamesEventsComponent(up=quot;pquot;, down=quot;lquot;, left=quot;aquot;, right=quot;squot;),
BasicSprite(quot;cat.pngquot;, name = quot;catquot;, border=40),
).activate() MyGames
Events
Component
Basic
Sprite
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
15. Graphline Example
Graphline(
NEXT = Button(...),
PREVIOUS = Button(...), PREVIOUS NEXT
FIRST = Button(...), (button) (button)
LAST = Button(...),
CHOOSER = Chooser(...),
FIRST LAST
IMAGE = Image(...),
(button) (button)
...
).run()
Chooser
Image
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
16. Server Example
data
from
user data
Socket handler
Main
to
Server Core
user
Created at runtime
to handle the
connection Remote
Protocol Handler Factory
User
Protocol handler
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
17. Server Example
You therefore
need to provide
this bit.
Main
Server Core
Protocol Handler Factory
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
18. Server Example
from Kamaelia.Chassis.ConnectedServer import ServerCore
from Kamaelia.Util.PureTransformer import PureTransformer
def greeter(*argv, **argd):
return PureTransformer(lambda x: quot;helloquot; +x)
class GreeterServer(ServerCore):
protocol=greeter
port=1601
GreeterServer().run()
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
19. Backplane Example
# Streaming Server for raw DVB of Radio 1
Backplane(“Radio”).activate()
Pipeline(
DVB_Multiplex(850.16, [6210], feparams), # RADIO ONE
PublishTo(quot;RADIOquot;),
).activate()
def radio(*argv,**argd):
return SubscribeTo(“RADIO”)
ServerCore(protocol=radio, port=1600).run()
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home
20. Thank you for listening!
If you have questions, grab me later :-)
Michael Sparks
BBC R&D, http://www.kamaelia.org/Home