SlideShare una empresa de Scribd logo
1 de 40
Async and Parallel Programming in F# Matthew Podwysocki Senior Consultant http://codebetter.com/ @mattpodwysocki
Agenda F# in 15 Minutes Why is concurrent programming so hard? What can F# do to help?
...a functional, object-oriented, imperative and explorative programming language for .NET with influences from OCaml, C#, Haskell and Erlang Hi! I’m F#
F# in 15 Minutes – The Facts F# is a general purpose .NETlanguage F# is a multi-paradigm language F# is a statically-typed language
F# in 15 Minutes - The Syntax binding names to values let lets = "Hello World" let (x, y) = (45, 54) let answer = x + y let numbers = [1 .. 10] let odds = [1; 3; 5; 7; 9] let square x = x * x let squareOf4 = square 4
F# in 15 Minutes - The Syntax functions as values fun let square x = x * x let squares = List.map (fun x -> x * x) [1..10] let squares = List.map square [1..10] Operators are functions too!
F# in 15 Minutes – The Syntax |> bringing order to chaos let (|>) x f = f x letsumOfSquares =    List.sum (List.map square [1..10]) letsumOfSquares = [1..10]                     |> List.map square                    |> List.sum <| >> << See also:
F# in 15 Minutes – The Syntax discriminated unions type type Suit = | Spade | Heart | Club | Diamond type Rank = | Ace | King | Queen | Jack             | Value ofint type Card = Card of Suit * Rank Microsoft Confidential
F# in 15 Minutes – The Syntax pattern matching match letcardValue (Card(s,r)) = match r with   | Ace                 -> 11   | King | Queen | Jack -> 10   | Value(x)            -> x let (x, y) = ("x", "y") let [a; b] = [1 ; 2] Microsoft Confidential
Concurrent programming with shared state… Is really hard! Microsoft Confidential
Shared State Gives Us… Race conditions! Obscure error messages! Late night debugging! Locks, mutexes and semaphores, oh my! Microsoft Confidential
How Can F# Help Us? Granularity Purity Immutability Libraries
In Praise of Immutability Immutable objects ... can be relied upon ... can transfer between threads ... can be aliased safely ... lead to (different) optimization opportunities
There is no silver bullet
Concurrency Styles Asynchronous Programming Parallel Programming Data Task Actor Model Concurrency
Asynchronous Programming
publicstaticvoidProcessImagesInBulk() { Console.WriteLine("Processing images...  "); long t0 = Environment.TickCount; NumImagesToFinish = numImages; AsyncCallbackreadImageCallback =  newAsyncCallback(ReadInImageCallback); for (inti = 0; i < numImages; i++)   { ImageStateObject state = newImageStateObject(); state.pixels = newbyte[numPixels]; state.imageNum = i; FileStreamfs = newFileStream(ImageBaseName + i + ".tmp", FileMode.Open, FileAccess.Read, FileShare.Read, 1, true); state.fs = fs; fs.BeginRead(state.pixels, 0, numPixels, readImageCallback,         state);   } boolmustBlock = false; lock (NumImagesMutex)   { if (NumImagesToFinish > 0) mustBlock = true;   } if (mustBlock)   { Console.WriteLine("All worker threads are queued. " + " Blocking until they complete. numLeft: {0}", NumImagesToFinish); Monitor.Enter(WaitObject); Monitor.Wait(WaitObject); Monitor.Exit(WaitObject);   } long t1 = Environment.TickCount; Console.WriteLine("Total time processing images: {0}ms",       (t1 - t0)); } publicstaticvoidReadInImageCallback(IAsyncResultasyncResult) { ImageStateObject state = (ImageStateObject)asyncResult.AsyncState; Streamstream = state.fs; intbytesRead = stream.EndRead(asyncResult); if (bytesRead != numPixels) thrownewException(String.Format         ("In ReadInImageCallback, got the wrong number of " + "bytes from the image: {0}.", bytesRead)); ProcessImage(state.pixels, state.imageNum); stream.Close(); FileStreamfs = newFileStream(ImageBaseName + state.imageNum + ".done", FileMode.Create, FileAccess.Write, FileShare.None,       4096, false); fs.Write(state.pixels, 0, numPixels); fs.Close(); state.pixels = null; fs = null; lock (NumImagesMutex)   { NumImagesToFinish--; if (NumImagesToFinish == 0)     { Monitor.Enter(WaitObject); Monitor.Pulse(WaitObject); Monitor.Exit(WaitObject);     }   } } using System; using System.IO; usingSystem.Threading; usingSystem.Runtime.InteropServices; usingSystem.Runtime.Remoting.Messaging; usingSystem.Security.Permissions; publicclassBulkImageProcAsync { publicconstStringImageBaseName = "tmpImage-"; publicconstintnumImages = 200; publicconstintnumPixels = 512 * 512; publicstaticintprocessImageRepeats = 20; publicstaticintNumImagesToFinish = numImages; publicstaticObject[] NumImagesMutex = newObject[0]; publicstaticObject[] WaitObject = newObject[0]; publicclassImageStateObject   { publicbyte[] pixels; publicintimageNum; publicFileStreamfs;   } “Asynchronous File I/O”http://msdn.microsoft.com/en-us/library/kztecsys.aspx State of Asynchronous I/O
letProcessImageAsynci = async { useinStream = File.OpenRead(sprintf"Image%d.tmp"i) let! pixels = inStream.AsyncRead(numPixels) let pixels' = ProcessImage(pixels, i) useoutStream = File.OpenWrite(sprintf"Image%d.done"i) do!outStream.AsyncWrite(pixels') } letProcessImagesAsync() = let tasks = [ foriin 1..numImages ->ProcessImageAsync(i) ] letparallelTasks = Async.Parallel tasks Async.RunSynchronouslyparallelTasks Why Isn’t it This Easy?
Read stream asynchronously letProcessImageAsynci = async { useinStream = File.OpenRead(sprintf"Image%d.tmp"i) let! pixels = inStream.AsyncRead(numPixels) let pixels' = ProcessImage(pixels, i) useoutStream = File.OpenWrite(sprintf"Image%d.done"i) do!outStream.AsyncWrite(pixels') } letProcessImagesAsync() = let tasks = [ for i in 1..numImages ->ProcessImageAsynci ] letparallelTasks = Async.Parallel tasks Async.RunSynnchronouslyparallelTasks This object coordinates Write stream asynchronously Generate the tasks and queue them in parallel “!”  = “asynchronous” Digging Deeper…
letgetHtml (url:string) = async { let request = WebRequest.Createurl use! response = request.AsyncGetResponse() use stream = response.GetResponseStream() use reader = newStreamReader(stream) return! reader.AsyncReadToEnd() } What we’re really writing letgetHtml (url:string) = async.Delay(fun () -> let request = WebRequest.Createurl async.Bind(request.AsyncGetResponse(), funresponse -> async.Using(response, fun response -> async.Using(response.GetResponseStream(), fun stream -> async.Using(new StreamReader(stream), fun reader -> reader.AsyncReadToEnd())))))
How does it work? Success Continuation Async<T> Execution Request Exception Continuation Cancellation Continuation
Anatomy of an Async Operation Async operations Begin/End typeSystem.Net.WebRequestwith memberthis.AsyncGetRequestStream() = Async.BuildPrimitive( this.BeginGetRequestStream,  this.EndGetRequestStream)
What Do We Get For Free? Code that makes sense Exception propagation Cancellation checking Simple resource lifetime management
Twitter Example
Parallel Programming Task Parallel Data Parallel
Data Parallel ProgrammingPLINQ Enable F# developers to leverage parallel hardware Abstracts away parallelism details Partitions and merges data intelligently Works on any seq<'a>/IEnumerable<T> let q = ratings   |> PSeq.adapt   |> PSeq.filter(funp ->p.Name = movieName && p.Rating >= 3.0 && p.Rating <= 5.0)   |> PSeq.sortBy(fun p ->p.Rating)   |> PSeq.map(funp ->p.CustomerId)
Task Parallel Programming Enable F# developers to create tasks in parallel letcomputeHash path algorithm = async { use stream = File.OpenRead path let! bytes = stream.AsyncRead(intstream.Length) let crypt = HashAlgorithm.Create algorithm returncrypt.ComputeHash bytes } let algorithms = ["MD5";"SHA1";"SHA256";"SHA384";"SHA512"] let [|md5;sha1;sha256;sha384;sha512|] = Async.RunSynchronously( Async.Parallel      [for algorithm in algorithms -> computeHash path algorithm])
Task Parallel + Async Workflows TPL Tasks integrated in .NET 4.0 Async Workflows Integrate with pre-defined tasks Calculate Futures letgetStreamData (uri:string) = async { let request = WebRequest.Createuri use! response = request.AsyncGetResponse() return [use stream = response.GetResponseStream() use reader = new StreamReader(stream) while not reader.EndOfStream doyieldreader.ReadLine()] } let result = Async.CreateAsTask <| getStreamDatamyUri do result.Start() letresultValue = result.Value
Bing Translator Example
Actor Model Concurrency Lots of little tasks Each process does one task Ant Colony Ants are processes sending messages to each other
Actor Model in Action… let (<--) (m:'aMailboxProcessor) msg = m.Post(msg) typePinger = Pong typePonger = Ping ofMailboxProcessor<Pinger> | Stop letponger =  newMailboxProcessor<Ponger>(funinbox -> let rec loop pongCount = async { let! msg = inbox.Receive() matchmsgwith               | Ping outbox ->                   outbox <-- Pong return! loop(pongCount + 1)               | Stop -> return () }     loop 0)
Actor Model in Action… letpinger count pong =   newMailboxProcessor<Pinger>(funinbox ->     let rec sendPing() =        async { pong <-- Ping(inbox)               return! loop (count - 1) }     and loop pingsLeft =       async { let! msg = inbox.Receive()               matchmsgwith               | Pong ->                   ifpingsLeft > 0 then                     pong <-- Ping(inbox)                     return! loop(pingsLeft - 1)                   else                                        pong <-- Stop                     return () }     sendPing())
Web Crawling Example
Ant Colony Example
High Performance Computing MPI.NET Dryad/DryadLINQ
What’s in Store for 2010?
Ways to Learn F# http://www.fsharp.net F# Interactive (FSI) Language Specification F# Team Blogs F# (FSharp) Discussion DL http://cs.hubfs.net CodePlex F# Samples .NET Reflector Go to Definition
Books about F#
Resources - Blogs Don Symehttp://blogs.msdn.com/dsyme/ Luke Hobanhttp://blogs.msdn.com/lukeh/ Brian McNamarahttp://lorgonblog.spaces.live.com/ Chris Smithhttp://blogs.msdn.com/chrsmith/ Jomo Fisherhttp://blogs.msdn.com/jomo_fisher/ Planet F#http://feeds.feedburner.com/planet_fsharp

Más contenido relacionado

La actualidad más candente

Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++Dmitri Nesteruk
 
Introduction to Go programming language
Introduction to Go programming languageIntroduction to Go programming language
Introduction to Go programming languageSlawomir Dorzak
 
Command line arguments that make you smile
Command line arguments that make you smileCommand line arguments that make you smile
Command line arguments that make you smileMartin Melin
 
Happy Go Programming
Happy Go ProgrammingHappy Go Programming
Happy Go ProgrammingLin Yo-An
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursPhillip Trelford
 
Go Programming Language (Golang)
Go Programming Language (Golang)Go Programming Language (Golang)
Go Programming Language (Golang)Ishin Vin
 
Reversing the dropbox client on windows
Reversing the dropbox client on windowsReversing the dropbox client on windows
Reversing the dropbox client on windowsextremecoders
 
Command Line Arguments with Getopt::Long
Command Line Arguments with Getopt::LongCommand Line Arguments with Getopt::Long
Command Line Arguments with Getopt::LongIan Kluft
 
Happy Go Programming Part 1
Happy Go Programming Part 1Happy Go Programming Part 1
Happy Go Programming Part 1Lin Yo-An
 
Golang iran - tutorial go programming language - Preliminary
Golang iran - tutorial  go programming language - PreliminaryGolang iran - tutorial  go programming language - Preliminary
Golang iran - tutorial go programming language - Preliminarygo-lang
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experimentAmos Wenger
 
Docase notation for Haskell
Docase notation for HaskellDocase notation for Haskell
Docase notation for HaskellTomas Petricek
 
Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Jimmy Schementi
 
Fantom on the JVM Devoxx09 BOF
Fantom on the JVM Devoxx09 BOFFantom on the JVM Devoxx09 BOF
Fantom on the JVM Devoxx09 BOFDror Bereznitsky
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume Laforge
 
A CTF Hackers Toolbox
A CTF Hackers ToolboxA CTF Hackers Toolbox
A CTF Hackers ToolboxStefan
 
Boost Maintainability
Boost MaintainabilityBoost Maintainability
Boost MaintainabilityMosky Liu
 
Learning Python from Data
Learning Python from DataLearning Python from Data
Learning Python from DataMosky Liu
 

La actualidad más candente (19)

Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++
 
Introduction to Go programming language
Introduction to Go programming languageIntroduction to Go programming language
Introduction to Go programming language
 
Go Lang Tutorial
Go Lang TutorialGo Lang Tutorial
Go Lang Tutorial
 
Command line arguments that make you smile
Command line arguments that make you smileCommand line arguments that make you smile
Command line arguments that make you smile
 
Happy Go Programming
Happy Go ProgrammingHappy Go Programming
Happy Go Programming
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 Hours
 
Go Programming Language (Golang)
Go Programming Language (Golang)Go Programming Language (Golang)
Go Programming Language (Golang)
 
Reversing the dropbox client on windows
Reversing the dropbox client on windowsReversing the dropbox client on windows
Reversing the dropbox client on windows
 
Command Line Arguments with Getopt::Long
Command Line Arguments with Getopt::LongCommand Line Arguments with Getopt::Long
Command Line Arguments with Getopt::Long
 
Happy Go Programming Part 1
Happy Go Programming Part 1Happy Go Programming Part 1
Happy Go Programming Part 1
 
Golang iran - tutorial go programming language - Preliminary
Golang iran - tutorial  go programming language - PreliminaryGolang iran - tutorial  go programming language - Preliminary
Golang iran - tutorial go programming language - Preliminary
 
ooc - A hybrid language experiment
ooc - A hybrid language experimentooc - A hybrid language experiment
ooc - A hybrid language experiment
 
Docase notation for Haskell
Docase notation for HaskellDocase notation for Haskell
Docase notation for Haskell
 
Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011Iron Languages - NYC CodeCamp 2/19/2011
Iron Languages - NYC CodeCamp 2/19/2011
 
Fantom on the JVM Devoxx09 BOF
Fantom on the JVM Devoxx09 BOFFantom on the JVM Devoxx09 BOF
Fantom on the JVM Devoxx09 BOF
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
A CTF Hackers Toolbox
A CTF Hackers ToolboxA CTF Hackers Toolbox
A CTF Hackers Toolbox
 
Boost Maintainability
Boost MaintainabilityBoost Maintainability
Boost Maintainability
 
Learning Python from Data
Learning Python from DataLearning Python from Data
Learning Python from Data
 

Similar a Async and Parallel F#

Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005Tugdual Grall
 
Programming Under Linux In Python
Programming Under Linux In PythonProgramming Under Linux In Python
Programming Under Linux In PythonMarwan Osman
 
golang_getting_started.pptx
golang_getting_started.pptxgolang_getting_started.pptx
golang_getting_started.pptxGuy Komari
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitVaclav Pech
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)James Titcumb
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Guillaume Laforge
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisFastly
 
Incredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and GeneratorsIncredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and Generatorsdantleech
 
2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Ws2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Wsloffenauer
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)Pavlo Baron
 
Intro to JavaFX & Widget FX
Intro to JavaFX & Widget FXIntro to JavaFX & Widget FX
Intro to JavaFX & Widget FXStephen Chin
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 
The ten commandments for an Agile Developer
The ten commandments for an Agile DeveloperThe ten commandments for an Agile Developer
The ten commandments for an Agile DeveloperSowmya Karmali
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.pptJoshCasas1
 

Similar a Async and Parallel F# (20)

Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005
 
Programming Under Linux In Python
Programming Under Linux In PythonProgramming Under Linux In Python
Programming Under Linux In Python
 
golang_getting_started.pptx
golang_getting_started.pptxgolang_getting_started.pptx
golang_getting_started.pptx
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruit
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007
 
Beyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic AnalysisBeyond Breakpoints: A Tour of Dynamic Analysis
Beyond Breakpoints: A Tour of Dynamic Analysis
 
Node.js
Node.jsNode.js
Node.js
 
Incredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and GeneratorsIncredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and Generators
 
2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Ws2007 09 10 Fzi Training Groovy Grails V Ws
2007 09 10 Fzi Training Groovy Grails V Ws
 
UNO based ODF Toolkit API
UNO based ODF Toolkit APIUNO based ODF Toolkit API
UNO based ODF Toolkit API
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Intro to JavaFX & Widget FX
Intro to JavaFX & Widget FXIntro to JavaFX & Widget FX
Intro to JavaFX & Widget FX
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
The ten commandments for an Agile Developer
The ten commandments for an Agile DeveloperThe ten commandments for an Agile Developer
The ten commandments for an Agile Developer
 
CGI.ppt
CGI.pptCGI.ppt
CGI.ppt
 
F# and the DLR
F# and the DLRF# and the DLR
F# and the DLR
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
Lettering js
Lettering jsLettering js
Lettering js
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 

Último

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 

Último (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 

Async and Parallel F#

  • 1. Async and Parallel Programming in F# Matthew Podwysocki Senior Consultant http://codebetter.com/ @mattpodwysocki
  • 2. Agenda F# in 15 Minutes Why is concurrent programming so hard? What can F# do to help?
  • 3. ...a functional, object-oriented, imperative and explorative programming language for .NET with influences from OCaml, C#, Haskell and Erlang Hi! I’m F#
  • 4.
  • 5. F# in 15 Minutes – The Facts F# is a general purpose .NETlanguage F# is a multi-paradigm language F# is a statically-typed language
  • 6. F# in 15 Minutes - The Syntax binding names to values let lets = "Hello World" let (x, y) = (45, 54) let answer = x + y let numbers = [1 .. 10] let odds = [1; 3; 5; 7; 9] let square x = x * x let squareOf4 = square 4
  • 7. F# in 15 Minutes - The Syntax functions as values fun let square x = x * x let squares = List.map (fun x -> x * x) [1..10] let squares = List.map square [1..10] Operators are functions too!
  • 8. F# in 15 Minutes – The Syntax |> bringing order to chaos let (|>) x f = f x letsumOfSquares = List.sum (List.map square [1..10]) letsumOfSquares = [1..10] |> List.map square |> List.sum <| >> << See also:
  • 9. F# in 15 Minutes – The Syntax discriminated unions type type Suit = | Spade | Heart | Club | Diamond type Rank = | Ace | King | Queen | Jack | Value ofint type Card = Card of Suit * Rank Microsoft Confidential
  • 10. F# in 15 Minutes – The Syntax pattern matching match letcardValue (Card(s,r)) = match r with | Ace -> 11 | King | Queen | Jack -> 10 | Value(x) -> x let (x, y) = ("x", "y") let [a; b] = [1 ; 2] Microsoft Confidential
  • 11. Concurrent programming with shared state… Is really hard! Microsoft Confidential
  • 12. Shared State Gives Us… Race conditions! Obscure error messages! Late night debugging! Locks, mutexes and semaphores, oh my! Microsoft Confidential
  • 13. How Can F# Help Us? Granularity Purity Immutability Libraries
  • 14. In Praise of Immutability Immutable objects ... can be relied upon ... can transfer between threads ... can be aliased safely ... lead to (different) optimization opportunities
  • 15. There is no silver bullet
  • 16. Concurrency Styles Asynchronous Programming Parallel Programming Data Task Actor Model Concurrency
  • 18. publicstaticvoidProcessImagesInBulk() { Console.WriteLine("Processing images... "); long t0 = Environment.TickCount; NumImagesToFinish = numImages; AsyncCallbackreadImageCallback = newAsyncCallback(ReadInImageCallback); for (inti = 0; i < numImages; i++) { ImageStateObject state = newImageStateObject(); state.pixels = newbyte[numPixels]; state.imageNum = i; FileStreamfs = newFileStream(ImageBaseName + i + ".tmp", FileMode.Open, FileAccess.Read, FileShare.Read, 1, true); state.fs = fs; fs.BeginRead(state.pixels, 0, numPixels, readImageCallback, state); } boolmustBlock = false; lock (NumImagesMutex) { if (NumImagesToFinish > 0) mustBlock = true; } if (mustBlock) { Console.WriteLine("All worker threads are queued. " + " Blocking until they complete. numLeft: {0}", NumImagesToFinish); Monitor.Enter(WaitObject); Monitor.Wait(WaitObject); Monitor.Exit(WaitObject); } long t1 = Environment.TickCount; Console.WriteLine("Total time processing images: {0}ms", (t1 - t0)); } publicstaticvoidReadInImageCallback(IAsyncResultasyncResult) { ImageStateObject state = (ImageStateObject)asyncResult.AsyncState; Streamstream = state.fs; intbytesRead = stream.EndRead(asyncResult); if (bytesRead != numPixels) thrownewException(String.Format ("In ReadInImageCallback, got the wrong number of " + "bytes from the image: {0}.", bytesRead)); ProcessImage(state.pixels, state.imageNum); stream.Close(); FileStreamfs = newFileStream(ImageBaseName + state.imageNum + ".done", FileMode.Create, FileAccess.Write, FileShare.None, 4096, false); fs.Write(state.pixels, 0, numPixels); fs.Close(); state.pixels = null; fs = null; lock (NumImagesMutex) { NumImagesToFinish--; if (NumImagesToFinish == 0) { Monitor.Enter(WaitObject); Monitor.Pulse(WaitObject); Monitor.Exit(WaitObject); } } } using System; using System.IO; usingSystem.Threading; usingSystem.Runtime.InteropServices; usingSystem.Runtime.Remoting.Messaging; usingSystem.Security.Permissions; publicclassBulkImageProcAsync { publicconstStringImageBaseName = "tmpImage-"; publicconstintnumImages = 200; publicconstintnumPixels = 512 * 512; publicstaticintprocessImageRepeats = 20; publicstaticintNumImagesToFinish = numImages; publicstaticObject[] NumImagesMutex = newObject[0]; publicstaticObject[] WaitObject = newObject[0]; publicclassImageStateObject { publicbyte[] pixels; publicintimageNum; publicFileStreamfs; } “Asynchronous File I/O”http://msdn.microsoft.com/en-us/library/kztecsys.aspx State of Asynchronous I/O
  • 19. letProcessImageAsynci = async { useinStream = File.OpenRead(sprintf"Image%d.tmp"i) let! pixels = inStream.AsyncRead(numPixels) let pixels' = ProcessImage(pixels, i) useoutStream = File.OpenWrite(sprintf"Image%d.done"i) do!outStream.AsyncWrite(pixels') } letProcessImagesAsync() = let tasks = [ foriin 1..numImages ->ProcessImageAsync(i) ] letparallelTasks = Async.Parallel tasks Async.RunSynchronouslyparallelTasks Why Isn’t it This Easy?
  • 20. Read stream asynchronously letProcessImageAsynci = async { useinStream = File.OpenRead(sprintf"Image%d.tmp"i) let! pixels = inStream.AsyncRead(numPixels) let pixels' = ProcessImage(pixels, i) useoutStream = File.OpenWrite(sprintf"Image%d.done"i) do!outStream.AsyncWrite(pixels') } letProcessImagesAsync() = let tasks = [ for i in 1..numImages ->ProcessImageAsynci ] letparallelTasks = Async.Parallel tasks Async.RunSynnchronouslyparallelTasks This object coordinates Write stream asynchronously Generate the tasks and queue them in parallel “!” = “asynchronous” Digging Deeper…
  • 21. letgetHtml (url:string) = async { let request = WebRequest.Createurl use! response = request.AsyncGetResponse() use stream = response.GetResponseStream() use reader = newStreamReader(stream) return! reader.AsyncReadToEnd() } What we’re really writing letgetHtml (url:string) = async.Delay(fun () -> let request = WebRequest.Createurl async.Bind(request.AsyncGetResponse(), funresponse -> async.Using(response, fun response -> async.Using(response.GetResponseStream(), fun stream -> async.Using(new StreamReader(stream), fun reader -> reader.AsyncReadToEnd())))))
  • 22. How does it work? Success Continuation Async<T> Execution Request Exception Continuation Cancellation Continuation
  • 23. Anatomy of an Async Operation Async operations Begin/End typeSystem.Net.WebRequestwith memberthis.AsyncGetRequestStream() = Async.BuildPrimitive( this.BeginGetRequestStream, this.EndGetRequestStream)
  • 24. What Do We Get For Free? Code that makes sense Exception propagation Cancellation checking Simple resource lifetime management
  • 26. Parallel Programming Task Parallel Data Parallel
  • 27. Data Parallel ProgrammingPLINQ Enable F# developers to leverage parallel hardware Abstracts away parallelism details Partitions and merges data intelligently Works on any seq<'a>/IEnumerable<T> let q = ratings |> PSeq.adapt |> PSeq.filter(funp ->p.Name = movieName && p.Rating >= 3.0 && p.Rating <= 5.0) |> PSeq.sortBy(fun p ->p.Rating) |> PSeq.map(funp ->p.CustomerId)
  • 28. Task Parallel Programming Enable F# developers to create tasks in parallel letcomputeHash path algorithm = async { use stream = File.OpenRead path let! bytes = stream.AsyncRead(intstream.Length) let crypt = HashAlgorithm.Create algorithm returncrypt.ComputeHash bytes } let algorithms = ["MD5";"SHA1";"SHA256";"SHA384";"SHA512"] let [|md5;sha1;sha256;sha384;sha512|] = Async.RunSynchronously( Async.Parallel [for algorithm in algorithms -> computeHash path algorithm])
  • 29. Task Parallel + Async Workflows TPL Tasks integrated in .NET 4.0 Async Workflows Integrate with pre-defined tasks Calculate Futures letgetStreamData (uri:string) = async { let request = WebRequest.Createuri use! response = request.AsyncGetResponse() return [use stream = response.GetResponseStream() use reader = new StreamReader(stream) while not reader.EndOfStream doyieldreader.ReadLine()] } let result = Async.CreateAsTask <| getStreamDatamyUri do result.Start() letresultValue = result.Value
  • 31. Actor Model Concurrency Lots of little tasks Each process does one task Ant Colony Ants are processes sending messages to each other
  • 32. Actor Model in Action… let (<--) (m:'aMailboxProcessor) msg = m.Post(msg) typePinger = Pong typePonger = Ping ofMailboxProcessor<Pinger> | Stop letponger = newMailboxProcessor<Ponger>(funinbox -> let rec loop pongCount = async { let! msg = inbox.Receive() matchmsgwith | Ping outbox -> outbox <-- Pong return! loop(pongCount + 1) | Stop -> return () } loop 0)
  • 33. Actor Model in Action… letpinger count pong =   newMailboxProcessor<Pinger>(funinbox ->     let rec sendPing() =       async { pong <-- Ping(inbox)               return! loop (count - 1) }     and loop pingsLeft =       async { let! msg = inbox.Receive()               matchmsgwith               | Pong ->                   ifpingsLeft > 0 then                     pong <-- Ping(inbox)                     return! loop(pingsLeft - 1)                   else                     pong <-- Stop                     return () }     sendPing())
  • 36. High Performance Computing MPI.NET Dryad/DryadLINQ
  • 37. What’s in Store for 2010?
  • 38. Ways to Learn F# http://www.fsharp.net F# Interactive (FSI) Language Specification F# Team Blogs F# (FSharp) Discussion DL http://cs.hubfs.net CodePlex F# Samples .NET Reflector Go to Definition
  • 40. Resources - Blogs Don Symehttp://blogs.msdn.com/dsyme/ Luke Hobanhttp://blogs.msdn.com/lukeh/ Brian McNamarahttp://lorgonblog.spaces.live.com/ Chris Smithhttp://blogs.msdn.com/chrsmith/ Jomo Fisherhttp://blogs.msdn.com/jomo_fisher/ Planet F#http://feeds.feedburner.com/planet_fsharp

Notas del editor

  1. What is the Problem?Multithreaded programming is hard todayDoable by only a subgroup of senior specialistsParallel patterns are not prevalent, well known, nor easy to implementSo many potential problemsRaces, deadlocks, livelocks, lock convoys, cache coherency overheads, lost event notifications, broken serializability, priority inversion, and so on…Businesses have little desire to go deepBest developers should focus on business value, not concurrencyNeed simple ways to allow all developers to write concurrent code