Question

En creusant plus profondément dans la dernière version de F # J'ai essayé de le faire interagir avec PLINQ. Je l'ai remarqué, cependant, que les deux ne jouent pas très bien ensemble code sage. En fait, il ne semble pas possible d'écrire du code tel que le suivant:


open System.Linq
let someArray = [|"abc"; "def"|]
someArray.AsParallel().Count(new Func<_,_>(fun s -> s.Length = 3))

parce que les méthodes d'extension pour ParallelQuery contenues dans la classe System.Linq.ParallelEnumerable ne semblaient pas obtenir ramassé par F #.
Je ne serais pas surpris s'il n'y avait pas de soutien pour les méthodes d'extension du tout, mais depuis que je peux accéder à la méthode d'extension de someArray.Count définie pour IEnumerable Je me demande pourquoi je ne peux pas accéder à ceux de PLINQ.
Est-ce que je manque quelque chose?
Est-ce une limitation F #? Si oui, est-il par desing? Dans le cas contraire, il sera résolu dans une prochaine version?

Était-ce utile?

La solution

Si vous n'êtes pas encore en utilisant .NET 4.0, vous pouvez écrire que:

#r "System.Threading"
open System.Linq

let someArray = [|"abc"; "def"|]

someArray.AsParallel<string>()
|> Seq.filter (fun s -> s.Length = 3)
|> Seq.length

Venez .NET 4.0, vous pouvez simplement écrire:

let someArray = [|"abc"; "def"|]

someArray
|> Array.Parallel.filter (fun s -> s.Length = 3)
|> Array.length

F # préfère l'utilisation du module Seq sur les méthodes d'extension LINQ. Cependant, il y a des fonctions d'aide disponibles, dans l'ensemble FSharp.PowerPack.Linq.

Autres conseils

Si je me souviens bien, se PLINQ travailler bien avec F # est sur la liste de tâches de l'équipe de développement chez Microsoft, bien que je ne suis pas sûr qu'il apparaîtra dans .NET 4.0. F # a cependant Asynchronous Workflows , ce qui est très similaire à PLINQ (sauf qu'il est basé autour de la liste comprehensions, qui est la façon fonctionnelle standard de faire les choses). Je ne peux pas sembler trouver l'article qui mentionne un meilleur soutien en F # pour les extensions parallèles (PLINQ / TPL), alors ne me citez pas là-dessus, mais je suis sûr que je l'ai vu quelque part.

En dehors de la page MSDN, cet article semble comme une bonne introduction au sujet.

Il y a aussi cette série blog ( utilisation PLINQ en F # ) qui pourrait être utile de lire si vous préférez utiliser PLINQ sur Async Workflows encore.

Les méthodes d'extension sont seulement qui prennent l'statics objet comme premier paramètre, vous devriez donc être en mesure d'appeler avec

ParallelEnumerable.AsParallel(someArray).Count(...)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top