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!
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:
Eine korrekte Implementierung würde wahrscheinlich die Fäden räumen, die danach herumliegen, übrigens.
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.
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).
Tags und Links haskell concurrency io