Mapping x2: использование потоков для работы - PullRequest
0 голосов
/ 29 февраля 2012

Попытка выполнить некоторое асинхронное программирование через потоки. Для начала, я пытаюсь простой случай: отображение списка параллельно. Код пока выглядит так:

let doWork (x:('a -> string)) (y:'a) (z:string ref) (finished:bool ref) =
    ThreadPool.QueueUserWorkItem( fun _ -> z:= x y
                                           finished:= true)
let dualmap (x:'a list) (y:'a -> string) (z:string -> 'b) = 
    let acc = []
    let rec dual (x:'a list) (y:'a -> 'b) (acc:'b list) = 
            match x with
            | [] -> acc
            | [i] -> (y i)::acc
            | i::j::tl -> let un      = ref ""
                          let deux    = ref ""
                          let unfin   = ref false
                          let deuxfin = ref false
                          doWork y i un   unfin   |> ignore //case i
                          doWork y j deux deuxfin |> ignore //case j
                          while not(unfin)||not(deuxfin) do Thread.Sleep(0)
                          let uno  = z !un
                          let dos  = z !deux 
                          dual tl y (dos::(uno::acc))
    dual x y acc

Однако я не уверен, как заставить потоки работать, так как они кажутся obj -> unit, а не 'a -> 'b или 'a -> 'b -> 'c, что мне и нужно.

Вместо этого я должен убедиться, что знаю, как преобразовать каждый объект, который у меня есть, в строку, а затем преобразовать его обратно. Кажется, должен быть более простой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Вы хотите использовать StartChild для параллельного запуска вещей, чтобы вы могли возвращать значения со статическими типами?

http://msdn.microsoft.com/en-us/library/ee370511.aspx

2 голосов
/ 01 марта 2012

Не используйте низкоуровневый API Thread (который утомителен и подвержен ошибкам);используйте либо библиотеку параллельных заданий (классы в System.Threading.Tasks), либо PLINQ (классы в System.Linq, в именах которых Parallel).Вот пример последнего:

open System.Linq

let pmap (x:_ seq) (f:'a -> 'b) =
    x.AsParallel().AsOrdered().Select(f).AsEnumerable()
2 голосов
/ 01 марта 2012

Вы хотите сделать что-то подобное?

let asyncMap f items = 
  let rec loop acc items =
    async {
      match items with
      | [] -> return List.rev acc
      | [x] -> 
        let! a = f x
        return! loop (a::acc) []
      | x::y::rest ->
        let! a = f x
        let! b = f y
        return! loop (b::a::acc) rest
    }
  loop [] items
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...