SlideShare a Scribd company logo
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous
Programming
        Or how we built a Dropbox clone without a
        PhD in Astrophysics



             Panagiotis Kanavos
             DotNetZone Moderator
             pkanavos@gmail.com
Why
• Processors are getting smaller
• Networks are getting worse
• Operating Systems demand it
• Only a subset of the code can run in parallel
Processors are getting smaller
• Once, a single-thread process could use 100%
  of the CPU
• 16% ΜΑΧ ona Quad core LAPTOP with
  HyperThreading
• 8% ΜΑΧ on an 8 core server
What we used to have
• Hand-coded threads and synchronization
• BackgroundWorker
    Heavy, cumbersome, single threaded, inadequate progress reporting

• EAP: From event to event
    Complicated, loss of continuity

• APM: BeginXXX/EndXXX
    Cumbersome, imagine socket programming with Begin/End!
     or rather ...
Why I stopped blogging
• Asynchronous Pipes with APM
The problem with threads
• Collisions
     Reduced throughput
     Deadlocks

• Solution: Limit the number of threads
     ThreadPools
     Extreme: Stackless Python
     Copy data instead of shared access
     Extreme: Immutable programming
Why should I care about
threads?
• How can I speed-up my algorithm?
• Which parts can run in parallel?
• How can I partition my data?
Example




          Revani
Synchronous Revani
•   Beat the yolks with 2/3 of sugar until fluffy
•   Beat the whites with 1/3 of sugar to stiff meringue
•   and add half the mixture to the yolk mixture.
•   Mix semolina with flour and ground coconut ,
•   add rest of meringue and mix
•   Mix and pour in cake pan
•   Bake in pre-heated oven at 170οC for 20-25 mins.
•   Allow to cool
•   Prepare syrup, boil water, sugar, lemon for 3 mins.
•   Pour warm syrup over revani
•   Sprinkle with ground coconut.
Parallel Revani
• Beat yolks                   • Beat Whites
           •   Add half mixture
           •   Mix semolina
           •   Add rest of meringue
           •   Mix
           •   Pour in cake pan

• Bake                          • Prepare syrup
               • Pour syrup
               • Sprinkle
What we have now
• Support for multiple concurrency scenarios
• Overall improvements in threading
• Highly Concurrent collections
Scenaria
• Faster processing of large data
  • Number crunching
• Execute long operations
• Serve high volume of requests
  • Social Sites, Web sites, Billing, Log aggregators
• Tasks with frequent blocking
  • REST clients, IT management apps
Scenario Classification
• Data Parallelism
• Task Parallelism
• Asynchronous programming
• Agents/Actors
• Dataflows
Data Parallelism – Recipe
• Partition the data
• Implement the algorithm in a function
• TPL creates the necessary tasks
• The tasks are assigned to threads
• I DON’T’T have to define the number of
  Tasks/Threads!
Data Parallelism - Tools
• Parallel.For / Parallel.ForEach
• PLINQ
• Partitioners
Parallel class Methods
• Parallel execution of lambdas
• Blocking calls!
• We specify
     Cancellation Token
     Maximum number of Threads
     Task Scheduler
PLINQ
• LINQ Queries
• Potentially multiple threads
• Parallel operators
• Unordered results
• Beware of races
  List<int> list = new List<int>();
  var q = src.AsParallel()
    .Select(x => { list.Add(x); return x; })
    .Where(x => true) .Take(100);
What it can’t do
• Doesn’t use SSE instructions
• Doesn’t use the GPU
• Isn’t using the CPU at 100%
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Scenaria
• Data Parallelism
• Task Parallelism
• Asynchronous programming
• Agents/Actors
• Dataflows
Task Parellelism – Recipe
• Break the problem into steps
• Convert each step to a function
• Combine steps with Continuations
• TPL assigns tasks to threads as needed
• I DON’T have to define number of
  Tasks/Threads!
• Cancellation of the entire task chain
The Improvements
• Tasks wherever code blocks
• Cancellation
• Lazy Initialization
• Progress Reporting
• Synchronization Contexts
Cancellation
• Problem: How do you cancel multiple tasks
  without leaving trash behind?
• Solution: Everyone monitors a
  CancellationToken
     TPL cancels subsequent Tasks or Parallel operations
     Created by a CancellationTokenSource
     Can execute code when Cancel is called
Progress Reporting
• Problem: How do you update the UI from inside
  a task?
• Solution: Using an IProgress<T> object
     Out-of-the-Box Progress<T> updates the current Synch Context
     Any type can be a message
     Replace with our own implementation
Lazy Initialization
• Calculate a value only when needed
• Lazy<T>(Func<T> …)
• Synchronous or Asynchronous calculation
     Lazy.Value
     Lazy.GetValueAsync<T>()
Synchronization Context
• Since .NET 2.0!
• Hides Winforms, WPF, ASP.NET
     SynchronizationContext.Post/Send instead of Dispatcher.Invoke etc
     Synchronous and Asynchronous version

• Automatically created by the environment
     SynchronizationContext.Current

• Can create our own
     E.g. For a Command Line aplication
Scenaria
• Data Parallelism
• Task Parallelism
• Asynchronous programming
• Agents/Actors
• Dataflows
Async/Await
• Support at the language leve
• Debugging support
• Exception Handling
• After await return to original “thread”
     Beware of servers and libraries

• Dos NOT always execute asynchronously
     Only when a task is encountered or the thread yields
     Task.Yield
Asynchronous Retry
private static async Task<T>
Retry<T>(Func<T> func, int retryCount) {
  while (true) {
    try {
      var result = await Task.Run(func);
      return result;
    }
    catch {
      If (retryCount == 0)
        throw;
      retryCount--;
} } }
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
More Goodies - Collections
•   Highly concurrent
•   Thread-safe
•   Not only for TPL/PLINQ
•   Producer/Consumer scenaria
Concurrent Collections - 2
• ConcurrentQueue
• ConcurrentStack
• ConcurrentDictionary
The Odd one - ConcurrentBag
• Duplicates allowed
• List per Thread
• Reduced collisions for each tread’s Add/Take
• BAD for Producer/Consumer
Concurrent Collections -
Gotchas
• NOT faster than plain collections in low
  concurrency scenarios
• DO NOT consume less memory
• DO NOT provide thread safe enumeration
• DO NOT ensure atomic operations on content
• DO NOT fix unsafe code
Also in .NET 4
• Visual Studio 2012
• Async Targeting package
• System.Net.HttpClient package
Other Technologies
• F# async
• C++ Parallel Patterns Library
• C++ Concurrency Runtime
• C++ Agents
• C++ AMP
• Object storage similar to Amazon S3/Azure Blob
  storage
• A Service of Synnefo – IaaS by GRNet
• Written in Python
• Clients for Web, Windows, iOS, Android, Linux
• Versioning, Permissions, Sharing
Synnefo
Pithos API
• REST API base on CloudFiles by Rackspace
     Compatible with CyberDuck etc

• Block storage
• Uploads only using blocks
• Uses Merkle Hashing
Pithos Client for Windows
• Multiple accounts per machine
• Synchronize local folder to a Pithos account
• Detect local changes and upload
• Detect server changes and download
• Calculate Merkle Hash for each file
The Architecture

   UI         Core         Networking    Storage

             File Agent
  WPF
                            CloudFiles     SQLite
             Poll Agent
  MVVM
             Network
              Agent
                                         SQL Server
 Caliburn                   HttpClient
                                          Compact
  Micro     Status Agent
Technologies
• .ΝΕΤ 4, due to Windows XP compatibility
• Visual Studio 2012 + Async Targeting Pack
• UI - Caliburn.Micro
• Concurrency - TPL, Parallel, Dataflow
• Network – HttpClient
• Hashing - OpenSSL – Faster than native provider for hashing
• Storage - NHibernate, SQLite/SQL Server Compact
• Logging - log4net
The challenges
• Handle potentially hundrends of file events
• Hashing of many/large files
• Multiple slow calls to the server
• Unreliable network
• And yet it shouldn’t hang
• Update the UI with enough information
Events Handling
• Use producer/consumer pattern
• Store events in ConcurrentQueue
• Process ONLY after idle timeout
Merkle Hashing
• Why I hate Game of Thrones


• Asynchronous reading of blocks
• Parallel Hashing of each block
• Use of OpenSSL for its SSE support
• Concurrency Throttling
• Beware of memory consumption!
Multiple slow calls

• Each call a task
• Concurrent REST calls per account and share
• Task.WhenAll to process results
Unreliable network

• Use System.Net.Http.HttpClient
• Store blocks in a cache folder
• Check and reuse orphans
• Asynchronous Retry of calls
Resilience to crashes
• Use Transactional NTFS if available
     Thanks MS for killing it!

• Update a copy and File.Replace otherwise
Should not hang
• Use of independent agents
• Asynchronous operations wherever possible
Provide Sufficient user feedback
• Use WPF, MVVM
• Use Progress to update the UI
Next Steps
• Create Windows 8 Dekstop and WinRT client
• Use Reactive Framework


    ΖΗΤΟΥΝΤΑΘ ΕΘΕΛΟΝΤΕΣ
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Clever Tricks
• Avoid Side Effects
• Use Functional Style
• Clean Coding
• THE BIG SECRET:
     Use existing, tested algorithms

• IEEE, ACM Journals and libraries
YES TPL
• Simplify asynchronous or parallel code
• Use out-of-the-box libraries
• Scenarios that SUIT Task or Data Parallelism
NO TPL
• To accelerate “bad” algorithms
• To “accelerate” database access
     Use proper SQL and Indexes!
     Avoid Cursors

• Reporting DBs, Data Warehouse, OLAP Cubes
When TPL is not enough
• Functional languages like F#, Scala
• Distributed Frameworks like Hadoop, {m}brace
Books
• C# 5 in a Nutshell, O’Riley
• Parallel Programming with .NET, Microsoft
• Pro Parallel Programming with C#, Wiley
• Concurrent Programming on Windows, Pearson
• The Art of Concurrency, O’Reilly
Useful Links
• Parallel FX Team:
  http://blogs.msdn.com/b/pfxteam/
• ΙΕΕΕ Computer Society
  http://www.computer.org
• ACM http://www.acm.org
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)

More Related Content

PPTX
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
PPTX
The server side story: Parallel and Asynchronous programming in .NET - ITPro...
PDF
Xen_and_Rails_deployment
PDF
FunctionalConf '16 Robert Virding Erlang Ecosystem
PDF
Five Years of EC2 Distilled
PPTX
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
PDF
Beyond Apache: Faster Web Servers
PPTX
Asynchronous programming in ASP.NET
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
The server side story: Parallel and Asynchronous programming in .NET - ITPro...
Xen_and_Rails_deployment
FunctionalConf '16 Robert Virding Erlang Ecosystem
Five Years of EC2 Distilled
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
Beyond Apache: Faster Web Servers
Asynchronous programming in ASP.NET

What's hot (17)

PDF
JS Fest 2019. Александр Хотемский. Способы распараллеливания тестов в JavaScript
KEY
Cooking a rabbit pie
PDF
Combining the strength of erlang and Ruby
PDF
Scaling with Symfony - PHP UK
PDF
Erlang factory 2011 london
PDF
Webinar: Queues with RabbitMQ - Lorna Mitchell
PDF
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
PDF
Modern software architectures - PHP UK Conference 2015
PPTX
Using Apache Camel as AKKA
PDF
Innovating faster with SBT, Continuous Delivery, and LXC
PDF
AppScale Talk at SBonRails
PDF
Erlang factory SF 2011 "Erlang and the big switch in social games"
PDF
Building Asynchronous Applications
PPTX
Scaling High Traffic Web Applications
PPSX
webservers
PPTX
Profiling and Tuning a Web Application - The Dirty Details
PDF
Big Data! Great! Now What? #SymfonyCon 2014
JS Fest 2019. Александр Хотемский. Способы распараллеливания тестов в JavaScript
Cooking a rabbit pie
Combining the strength of erlang and Ruby
Scaling with Symfony - PHP UK
Erlang factory 2011 london
Webinar: Queues with RabbitMQ - Lorna Mitchell
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
Modern software architectures - PHP UK Conference 2015
Using Apache Camel as AKKA
Innovating faster with SBT, Continuous Delivery, and LXC
AppScale Talk at SBonRails
Erlang factory SF 2011 "Erlang and the big switch in social games"
Building Asynchronous Applications
Scaling High Traffic Web Applications
webservers
Profiling and Tuning a Web Application - The Dirty Details
Big Data! Great! Now What? #SymfonyCon 2014
Ad

Similar to Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek) (20)

PDF
I see deadlocks : Matt Ellis - Techorama NL 2024
PPTX
Parallel programming in .NET
PDF
Parallel Programming With Microsoft Net Design Patterns For Decomposition And...
PPTX
Parallel programming patterns - Олександр Павлишак
PPTX
Parallel programming patterns (UA)
PDF
Concurrency and parallel in .net
PPTX
Multi core programming 1
PDF
.Net Multithreading and Parallelization
PPTX
Coding For Cores - C# Way
PPT
Parallel Programming and F#
PPTX
Pithos - Architecture and .NET Technologies
PPTX
C# 5 deep drive into asynchronous programming
ZIP
.Net 4.0 Threading and Parallel Programming
PPTX
Parallel Programming
PPTX
Concurrency in c#
PDF
Concurrecny inf sharp
PPT
Overview Of Parallel Development - Ericnel
PDF
Concurrent Programming On Windows Joe Duffy
PPTX
Async/Await
PDF
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
I see deadlocks : Matt Ellis - Techorama NL 2024
Parallel programming in .NET
Parallel Programming With Microsoft Net Design Patterns For Decomposition And...
Parallel programming patterns - Олександр Павлишак
Parallel programming patterns (UA)
Concurrency and parallel in .net
Multi core programming 1
.Net Multithreading and Parallelization
Coding For Cores - C# Way
Parallel Programming and F#
Pithos - Architecture and .NET Technologies
C# 5 deep drive into asynchronous programming
.Net 4.0 Threading and Parallel Programming
Parallel Programming
Concurrency in c#
Concurrecny inf sharp
Overview Of Parallel Development - Ericnel
Concurrent Programming On Windows Joe Duffy
Async/Await
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
Ad

More from Panagiotis Kanavos (8)

PPTX
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
PPTX
65ο DotNetZone event: Tpl data flow και railway oriented programming
PPTX
Περατζάδα στο Azure Event Hub
PPTX
Ο βασιλιάς Git!
PPTX
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
PPTX
The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - I...
PPTX
Πίθος - Αρχιτεκτονική και τεχνολογίες .NET
PPTX
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
65ο DotNetZone event: Tpl data flow και railway oriented programming
Περατζάδα στο Azure Event Hub
Ο βασιλιάς Git!
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - I...
Πίθος - Αρχιτεκτονική και τεχνολογίες .NET
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)

Recently uploaded (20)

PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPT
Teaching material agriculture food technology
PPTX
Cloud computing and distributed systems.
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Big Data Technologies - Introduction.pptx
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
KodekX | Application Modernization Development
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
Sensors and Actuators in IoT Systems using pdf
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Diabetes mellitus diagnosis method based random forest with bat algorithm
Teaching material agriculture food technology
Cloud computing and distributed systems.
Reach Out and Touch Someone: Haptics and Empathic Computing
“AI and Expert System Decision Support & Business Intelligence Systems”
Big Data Technologies - Introduction.pptx
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Per capita expenditure prediction using model stacking based on satellite ima...
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
NewMind AI Monthly Chronicles - July 2025
Chapter 3 Spatial Domain Image Processing.pdf
KodekX | Application Modernization Development
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
Understanding_Digital_Forensics_Presentation.pptx
How Onsite IT Support Drives Business Efficiency, Security, and Growth.pdf
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Sensors and Actuators in IoT Systems using pdf
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)

Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)

  • 2. Parallel and Asynchronous Programming Or how we built a Dropbox clone without a PhD in Astrophysics Panagiotis Kanavos DotNetZone Moderator [email protected]
  • 3. Why • Processors are getting smaller • Networks are getting worse • Operating Systems demand it • Only a subset of the code can run in parallel
  • 4. Processors are getting smaller • Once, a single-thread process could use 100% of the CPU • 16% ΜΑΧ ona Quad core LAPTOP with HyperThreading • 8% ΜΑΧ on an 8 core server
  • 5. What we used to have • Hand-coded threads and synchronization • BackgroundWorker  Heavy, cumbersome, single threaded, inadequate progress reporting • EAP: From event to event  Complicated, loss of continuity • APM: BeginXXX/EndXXX  Cumbersome, imagine socket programming with Begin/End! or rather ...
  • 6. Why I stopped blogging • Asynchronous Pipes with APM
  • 7. The problem with threads • Collisions  Reduced throughput  Deadlocks • Solution: Limit the number of threads  ThreadPools  Extreme: Stackless Python  Copy data instead of shared access  Extreme: Immutable programming
  • 8. Why should I care about threads? • How can I speed-up my algorithm? • Which parts can run in parallel? • How can I partition my data?
  • 9. Example Revani
  • 10. Synchronous Revani • Beat the yolks with 2/3 of sugar until fluffy • Beat the whites with 1/3 of sugar to stiff meringue • and add half the mixture to the yolk mixture. • Mix semolina with flour and ground coconut , • add rest of meringue and mix • Mix and pour in cake pan • Bake in pre-heated oven at 170οC for 20-25 mins. • Allow to cool • Prepare syrup, boil water, sugar, lemon for 3 mins. • Pour warm syrup over revani • Sprinkle with ground coconut.
  • 11. Parallel Revani • Beat yolks • Beat Whites • Add half mixture • Mix semolina • Add rest of meringue • Mix • Pour in cake pan • Bake • Prepare syrup • Pour syrup • Sprinkle
  • 12. What we have now • Support for multiple concurrency scenarios • Overall improvements in threading • Highly Concurrent collections
  • 13. Scenaria • Faster processing of large data • Number crunching • Execute long operations • Serve high volume of requests • Social Sites, Web sites, Billing, Log aggregators • Tasks with frequent blocking • REST clients, IT management apps
  • 14. Scenario Classification • Data Parallelism • Task Parallelism • Asynchronous programming • Agents/Actors • Dataflows
  • 15. Data Parallelism – Recipe • Partition the data • Implement the algorithm in a function • TPL creates the necessary tasks • The tasks are assigned to threads • I DON’T’T have to define the number of Tasks/Threads!
  • 16. Data Parallelism - Tools • Parallel.For / Parallel.ForEach • PLINQ • Partitioners
  • 17. Parallel class Methods • Parallel execution of lambdas • Blocking calls! • We specify  Cancellation Token  Maximum number of Threads  Task Scheduler
  • 18. PLINQ • LINQ Queries • Potentially multiple threads • Parallel operators • Unordered results • Beware of races List<int> list = new List<int>(); var q = src.AsParallel() .Select(x => { list.Add(x); return x; }) .Where(x => true) .Take(100);
  • 19. What it can’t do • Doesn’t use SSE instructions • Doesn’t use the GPU • Isn’t using the CPU at 100%
  • 21. Scenaria • Data Parallelism • Task Parallelism • Asynchronous programming • Agents/Actors • Dataflows
  • 22. Task Parellelism – Recipe • Break the problem into steps • Convert each step to a function • Combine steps with Continuations • TPL assigns tasks to threads as needed • I DON’T have to define number of Tasks/Threads! • Cancellation of the entire task chain
  • 23. The Improvements • Tasks wherever code blocks • Cancellation • Lazy Initialization • Progress Reporting • Synchronization Contexts
  • 24. Cancellation • Problem: How do you cancel multiple tasks without leaving trash behind? • Solution: Everyone monitors a CancellationToken  TPL cancels subsequent Tasks or Parallel operations  Created by a CancellationTokenSource  Can execute code when Cancel is called
  • 25. Progress Reporting • Problem: How do you update the UI from inside a task? • Solution: Using an IProgress<T> object  Out-of-the-Box Progress<T> updates the current Synch Context  Any type can be a message  Replace with our own implementation
  • 26. Lazy Initialization • Calculate a value only when needed • Lazy<T>(Func<T> …) • Synchronous or Asynchronous calculation  Lazy.Value  Lazy.GetValueAsync<T>()
  • 27. Synchronization Context • Since .NET 2.0! • Hides Winforms, WPF, ASP.NET  SynchronizationContext.Post/Send instead of Dispatcher.Invoke etc  Synchronous and Asynchronous version • Automatically created by the environment  SynchronizationContext.Current • Can create our own  E.g. For a Command Line aplication
  • 28. Scenaria • Data Parallelism • Task Parallelism • Asynchronous programming • Agents/Actors • Dataflows
  • 29. Async/Await • Support at the language leve • Debugging support • Exception Handling • After await return to original “thread”  Beware of servers and libraries • Dos NOT always execute asynchronously  Only when a task is encountered or the thread yields  Task.Yield
  • 30. Asynchronous Retry private static async Task<T> Retry<T>(Func<T> func, int retryCount) { while (true) { try { var result = await Task.Run(func); return result; } catch { If (retryCount == 0) throw; retryCount--; } } }
  • 32. More Goodies - Collections • Highly concurrent • Thread-safe • Not only for TPL/PLINQ • Producer/Consumer scenaria
  • 33. Concurrent Collections - 2 • ConcurrentQueue • ConcurrentStack • ConcurrentDictionary
  • 34. The Odd one - ConcurrentBag • Duplicates allowed • List per Thread • Reduced collisions for each tread’s Add/Take • BAD for Producer/Consumer
  • 35. Concurrent Collections - Gotchas • NOT faster than plain collections in low concurrency scenarios • DO NOT consume less memory • DO NOT provide thread safe enumeration • DO NOT ensure atomic operations on content • DO NOT fix unsafe code
  • 36. Also in .NET 4 • Visual Studio 2012 • Async Targeting package • System.Net.HttpClient package
  • 37. Other Technologies • F# async • C++ Parallel Patterns Library • C++ Concurrency Runtime • C++ Agents • C++ AMP
  • 38. • Object storage similar to Amazon S3/Azure Blob storage • A Service of Synnefo – IaaS by GRNet • Written in Python • Clients for Web, Windows, iOS, Android, Linux • Versioning, Permissions, Sharing
  • 40. Pithos API • REST API base on CloudFiles by Rackspace  Compatible with CyberDuck etc • Block storage • Uploads only using blocks • Uses Merkle Hashing
  • 41. Pithos Client for Windows • Multiple accounts per machine • Synchronize local folder to a Pithos account • Detect local changes and upload • Detect server changes and download • Calculate Merkle Hash for each file
  • 42. The Architecture UI Core Networking Storage File Agent WPF CloudFiles SQLite Poll Agent MVVM Network Agent SQL Server Caliburn HttpClient Compact Micro Status Agent
  • 43. Technologies • .ΝΕΤ 4, due to Windows XP compatibility • Visual Studio 2012 + Async Targeting Pack • UI - Caliburn.Micro • Concurrency - TPL, Parallel, Dataflow • Network – HttpClient • Hashing - OpenSSL – Faster than native provider for hashing • Storage - NHibernate, SQLite/SQL Server Compact • Logging - log4net
  • 44. The challenges • Handle potentially hundrends of file events • Hashing of many/large files • Multiple slow calls to the server • Unreliable network • And yet it shouldn’t hang • Update the UI with enough information
  • 45. Events Handling • Use producer/consumer pattern • Store events in ConcurrentQueue • Process ONLY after idle timeout
  • 46. Merkle Hashing • Why I hate Game of Thrones • Asynchronous reading of blocks • Parallel Hashing of each block • Use of OpenSSL for its SSE support • Concurrency Throttling • Beware of memory consumption!
  • 47. Multiple slow calls • Each call a task • Concurrent REST calls per account and share • Task.WhenAll to process results
  • 48. Unreliable network • Use System.Net.Http.HttpClient • Store blocks in a cache folder • Check and reuse orphans • Asynchronous Retry of calls
  • 49. Resilience to crashes • Use Transactional NTFS if available  Thanks MS for killing it! • Update a copy and File.Replace otherwise
  • 50. Should not hang • Use of independent agents • Asynchronous operations wherever possible
  • 51. Provide Sufficient user feedback • Use WPF, MVVM • Use Progress to update the UI
  • 52. Next Steps • Create Windows 8 Dekstop and WinRT client • Use Reactive Framework ΖΗΤΟΥΝΤΑΘ ΕΘΕΛΟΝΤΕΣ
  • 54. Clever Tricks • Avoid Side Effects • Use Functional Style • Clean Coding • THE BIG SECRET:  Use existing, tested algorithms • IEEE, ACM Journals and libraries
  • 55. YES TPL • Simplify asynchronous or parallel code • Use out-of-the-box libraries • Scenarios that SUIT Task or Data Parallelism
  • 56. NO TPL • To accelerate “bad” algorithms • To “accelerate” database access  Use proper SQL and Indexes!  Avoid Cursors • Reporting DBs, Data Warehouse, OLAP Cubes
  • 57. When TPL is not enough • Functional languages like F#, Scala • Distributed Frameworks like Hadoop, {m}brace
  • 58. Books • C# 5 in a Nutshell, O’Riley • Parallel Programming with .NET, Microsoft • Pro Parallel Programming with C#, Wiley • Concurrent Programming on Windows, Pearson • The Art of Concurrency, O’Reilly
  • 59. Useful Links • Parallel FX Team: http://blogs.msdn.com/b/pfxteam/ • ΙΕΕΕ Computer Society http://www.computer.org • ACM http://www.acm.org