Warten auf zwei Eingaben in Haskell gleichzeitig

8

Der Titel ist vielleicht etwas vage. Das meine ich:

Sagen wir, ich habe zwei Möglichkeiten, um in mein Programm zu kommen. Die erste ist über die Tastatur, mit der Funktion getLine , die blockiert, bis eine Zeile gelesen wird. Die andere ist, sagen wir, über TChan , wobei% ce_de% auch zu einem Block führt, bis ein Wert im Kanal vorhanden ist, woraufhin er gelesen wird.

Was ich erreichen möchte ist, dass ich auf beide Werte warten kann, indem ich einen einzelnen Thread verwende und nicht zulasse, dass meine CPU zu 100% springt. Sobald einer der beiden Werte verfügbar ist, wird er abgerufen und das Programm wird fortgesetzt. (Sagen wir, mit readTChan chan zu benachrichtigen, welcher der beiden Werte empfangen wurde.)

Ist das möglich?

Vielen Dank!

    
Don Stewart 11.01.2010, 06:23
quelle

3 Antworten

12

Ich denke nicht, dass "einen einzigen Thread verwenden" hier sinnvoll ist. Sie müssen bereits mehrere Haskell-Threads verwenden, um in das TChan zu schreiben. Sie sollten dazu zwei Haskell-Threads verwenden und ein MVar oder ähnliches verwenden, um das erste Ergebnis zu übermitteln. Zum Beispiel:

%Vor%

Eine korrekte Implementierung würde wahrscheinlich die Fäden räumen, die danach herumliegen, übrigens.

    
Ganesh Sittampalam 11.01.2010, 10:23
quelle
5
  

Ich habe zwei Möglichkeiten, um in mein Programm zu kommen

Sie sollten in der Lage sein, zwei Threads zu verwenden, einen pro Eingabequelle, die auf ihre jeweiligen Eingaben warten und das Ergebnis in einen gemeinsamen Kanal oder eine mvar schreiben, der von einem dritten Thread gesteuert wird.

    
Don Stewart 11.01.2010 10:58
quelle
1

Es gibt die Helferfunktion race :: IO a -> IO b -> IO (Either a b) im "async" -Paket im Hack.

Führt zwei E / A-Aktionen gleichzeitig aus, also könnte eine Ihre getLine und die andere auf einer MVar oder was auch immer blockieren. Gibt eine Either zurück, die angibt, welche zuerst zurückgegeben wurde (die andere wird abgebrochen).

Ссылка

    
pdxleif 25.11.2015 06:30
quelle

Tags und Links