Concurrency and interactive input
Walker Duhon
wduhon@windows.microsoft.com
Wed, 30 Oct 2002 18:02:52 -0800
This is a multi-part message in MIME format.
--------------InterScan_NT_MIME_Boundary
Content-Type: multipart/alternative;
boundary="----_=_NextPart_001_01C28081.9F28BAB8"
------_=_NextPart_001_01C28081.9F28BAB8
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
=20
Hello,
I am playing around with concurrency using ghc 5.02.2. What
I'd like to do is have a bunch of threads do something indefinitely,
while one thread monitors stdin for user input (the user input affects
the behavior of the other threads in some way). From the documentation
I had assumed that standard Haskell I/O functions (like getline) would
not block other running threads, but this doesn't seem to be the case as
illustrated here:
=20
conTry3 =3D forkIO (loop 'a') >> quitYet
where
loop ch =3D hPutChar stdout ch >> loop ch
quitYet =3D do=20
x <- getLine
if x =3D=3D "quit" then return ()
else quitYet
=20
Output: (stuff in between {} is a comment, and not part of the output)
rere
ttt
fff
dfsd
fgfg
fgfg
aaaaaaaaaaaaaaaaaa { and on and on }
dfdf
dfd
fdfd
fgfg
=20
fgf
aaaaaaaaaaaaaaaa { and on and on }
quit
aaaaaaa { and on and on }
{program ends}
=20
The behavior I wanted was for 'a' to be printed (almost) continuously,
echo the relatively infrequent input, and quit upon receiving "quit".
I am aware (through a web search) that there was a mail
thread addressing a similar issue a while back (1999) entitled:
I thought concurrent haskell was
_preemptive_!
That thread made it seem like the issue would be cleared up
soon.
=20
In any case, I would still like to be able to have an interactive input
thread that doesn't block everything in my program.
Is there any way to do this?
=20
Thanks in advance,
Walker
=20
=20
=20
------_=_NextPart_001_01C28081.9F28BAB8
Content-Type: text/html;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<meta http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dus-ascii">
<meta name=3DGenerator content=3D"Microsoft Word 10 (filtered)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Courier;
panose-1:2 7 4 9 2 2 5 2 4 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
span.EmailStyle17
{font-family:Arial;
color:windowtext;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body lang=3DEN-US link=3Dblue vlink=3Dpurple>
<div class=3DSection1>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Hello,</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
I
am playing around with concurrency using ghc 5.02.2. What =
I’d like
to do is have a bunch of threads do something indefinitely, while one =
thread
monitors stdin for user input (the user input affects the behavior of =
the other
threads in some way). From the documentation I had assumed that =
standard Haskell
I/O functions (like getline) would not block other running threads, but =
this
doesn’t seem to be the case as illustrated here:</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'>conTry3 =3D forkIO (loop 'a') >> =
quitYet</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;
where</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;
loop ch =3D hPutChar stdout ch >> loop ch</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;
quitYet =3D do </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;
x <- getLine</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;
if x =3D=3D "quit" then return ()</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> &nbs=
p;  =
;
else quitYet</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Output: (stuff in between {} is a comment, and not =
part of
the output)</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>rere</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>ttt</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fff</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>dfsd</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fgfg</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fgfg</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>aaaaaaaaaaaaaaaaaa { and on =
and on }</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>dfdf</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>dfd</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fdfd</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fgfg</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'> </span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>fgf</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>aaaaaaaaaaaaaaaa { and on =
and on }</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>quit</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>aaaaaaa { and on and on =
}</span></font></p>
<p class=3DMsoNormal style=3D'margin-left:.5in'><font size=3D2 =
face=3DArial><span
style=3D'font-size:10.0pt;font-family:Arial'>{program =
ends}</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>The behavior I wanted was for ‘a’ to be =
printed
(almost) continuously, echo the relatively infrequent input, and quit =
upon
receiving “quit”.</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
I
am aware (through a web search) that there was a mail thread addressing =
a
similar issue a while back (1999) entitled:</span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> =
&=
nbsp;
</span></font><i><span style=3D'font-style:italic'>I thought =
concurrent haskell
was _preemptive_!</span></i></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'>  =
; That
thread made it seem like the issue would be cleared up =
soon.</span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'> </span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'>In any case, I would still like to be able to have an =
interactive input
thread that doesn’t block everything in my =
program.</span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'>Is there any way to do this?</span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'> </span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'>Thanks in advance,</span></font></p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'>  =
; </span></font>Walker</p>
<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'> </span></font></p>
<p class=3DMsoNormal><font size=3D2 face=3DCourier><span =
style=3D'font-size:10.0pt;
font-family:Courier'> </span></font></p>
</div>
</body>
</html>
=00
------_=_NextPart_001_01C28081.9F28BAB8--
--------------InterScan_NT_MIME_Boundary--