Re: clean up resources after interrupted page load
Sviatoslav Sydorenko <[email protected]> Sat, 29 Jun 2019 20:25:12 +0200
| Newsgroups | gmane.comp.python.cherrypy |
|---|---|
| Message-ID | <CAFYONRBoAZFtBsPj1xs3GzLDac5iCvww5zd_wVbEPs4gVs_pGQ@mail.gmail.com> |
--000000000000b89d2a058c7a840f
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Timeout feature has been deprecated because it's not really possible to
cancel threads. The solution would be to rewrite the engine to use async
paradigm.
Try submitting an issue against Cheroot with a minimal reproducer. There's
some WIP there which aims to improve the connection management.
--Sviatoslav.
Sent from my phone, please pardon any typos.
=D1=81=D0=B1, 29 =D1=87=D0=B5=D1=80=D0=B2. 2019, 10:05 =D0=BA=D0=BE=D1=80=
=D0=B8=D1=81=D1=82=D1=83=D0=B2=D0=B0=D1=87 Anatoliy Kushner <lamazavra@gmai=
l.com>
=D0=BF=D0=B8=D1=88=D0=B5:
> With sample code below if subscriber interrupt page load somewhere betwee=
n
> client.connect and client.close() then cherrypy will hang and will not
> clean up used resources like: 1) open tcp socket (from netstat -anpt on
> this server i see tcp connections to server that is established for some
> days, while time to executing any commands should finish in 10 sec) 2) fr=
om
> ps -p 'cherrypy pid' H , i see , that number of threads increased, and
> number of threads equals number of unclosed tcp connections
>
> while debugging this i found that thread stop at "yield bytes(a, 'utf-8')=
"
> in while loop. So , is there any way to say cherrypy to kill threads afte=
r
> some timeout ?
>
> P.S. response.timeout =3D 30 already set in config and this does not help
>
>
>
> @cherrypy.expose
>
> def test(self, *args, **kwargs):
> ...
> ...
> def getData(host, cmd):
> html =3D open("menuRp1.html").read()
> yield bytes(html, 'utf-8')
> client =3D paramiko.SSHClient()
> client.connect(hostname=3Dhost, username=3Duser, password=3Dpwd, port=
=3D22)
> stdin, stdout, stderr =3D client.exec_command(cmd)
> a=3Dstdout.readline()
> while a:
> yield bytes(a, 'utf-8')
> a=3Dstdout.readline()
> client.close()
> html =3D open("menuRp2.html").read()
> yield bytes(html, 'utf-8')
> return getData(h, c)
> test._cp_config =3D {'response.stream': True}
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "cherrypy-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to cherrypy-users+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected]
> To post to this group, send email to cherrypy-users-/JYPxA39Uh5TLH3MbocFF+G/[email protected]
> Visit this group at https://groups.google.com/group/cherrypy-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/cherrypy-users/92d0f922-5e40-4a5c-b3d6-=
a99d10ff0830%40googlegroups.com
> <https://groups.google.com/d/msgid/cherrypy-users/92d0f922-5e40-4a5c-b3d6=
-a99d10ff0830%40googlegroups.com?utm_medium=3Demail&utm_source=3Dfooter>
> .
> For more options, visit https://groups.google.com/d/optout.
>
--=20
You received this message because you are subscribed to the Google Groups "=
cherrypy-users" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to cherrypy-users+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected]
To post to this group, send email to cherrypy-users-/JYPxA39Uh5TLH3MbocFF+G/[email protected]
Visit this group at https://groups.google.com/group/cherrypy-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/=
cherrypy-users/CAFYONRBoAZFtBsPj1xs3GzLDac5iCvww5zd_wVbEPs4gVs_pGQ%40mail.g=
mail.com.
For more options, visit https://groups.google.com/d/optout.
--000000000000b89d2a058c7a840f
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto">Timeout feature has been deprecated because it's not =
really possible to cancel threads. The solution would be to rewrite the eng=
ine to use async paradigm.<div dir=3D"auto"><br></div><div dir=3D"auto">Try=
submitting an issue against Cheroot with a minimal reproducer. There's=
some WIP there which aims to improve the connection management.</div><div =
dir=3D"auto"><br><br><div data-smartmail=3D"gmail_signature" dir=3D"auto">-=
-Sviatoslav.<br><br>Sent from my phone, please pardon any typos.</div></div=
></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr"=
>=D1=81=D0=B1, 29 =D1=87=D0=B5=D1=80=D0=B2. 2019, 10:05 =D0=BA=D0=BE=D1=80=
=D0=B8=D1=81=D1=82=D1=83=D0=B2=D0=B0=D1=87 Anatoliy Kushner <<a href=3D"=
mailto:[email protected]">[email protected]</a>> =D0=BF=D0=B8=D1=88=
=D0=B5:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8=
ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><p>With sa=
mple code below if subscriber interrupt page load somewhere=20
between client.connect and client.close() then cherrypy will hang and=20
will not clean up used resources like:
1) open tcp socket (from netstat -anpt on this server i see tcp=20
connections to server that is established for some days, while time to=20
executing any commands should finish in 10 sec)
2) from ps -p 'cherrypy pid' H , i see , that number of threads=20
increased, and number of threads equals number of unclosed tcp=20
connections</p>
<p>while debugging this i found that thread stop at "yield bytes(a, &#=
39;utf-8')" in while loop.=20
So , is there any way to say cherrypy to kill threads after some timeout ? =
</p>
<p>P.S. response.timeout =3D 30 already set in config and this does not he=
lp</p><p><br></p><p><br></p><p></p><div style=3D"background-color:rgb(250,2=
50,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" =
class=3D"m_7974091648130462222prettyprint"><code class=3D"m_797409164813046=
2222prettyprint"><div class=3D"m_7974091648130462222subprettyprint"><code><=
span style=3D"color:#066" class=3D"m_7974091648130462222styled-by-prettify"=
>@cherrypy</span><span style=3D"color:#660" class=3D"m_7974091648130462222s=
tyled-by-prettify">.</span><span style=3D"color:#000" class=3D"m_7974091648=
130462222styled-by-prettify">expose</span></code><span style=3D"color:#000"=
class=3D"m_7974091648130462222styled-by-prettify"><br></span><code></code>=
<pre class=3D"m_7974091648130462222lang-py m_7974091648130462222prettyprint=
m_7974091648130462222prettyprinted"><code><span style=3D"color:#008" class=
=3D"m_7974091648130462222styled-by-prettify">def</span><span style=3D"color=
:#000" class=3D"m_7974091648130462222styled-by-prettify"> test</span><span =
style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">(</s=
pan><span style=3D"color:#008" class=3D"m_7974091648130462222styled-by-pret=
tify">self</span><span style=3D"color:#660" class=3D"m_7974091648130462222s=
tyled-by-prettify">,</span><span style=3D"color:#000" class=3D"m_7974091648=
130462222styled-by-prettify"> </span><span style=3D"color:#660" class=3D"m_=
7974091648130462222styled-by-prettify">*</span><span style=3D"color:#000" c=
lass=3D"m_7974091648130462222styled-by-prettify">args</span><span style=3D"=
color:#660" class=3D"m_7974091648130462222styled-by-prettify">,</span><span=
style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"> </=
span><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-pre=
ttify">**</span><span style=3D"color:#000" class=3D"m_7974091648130462222st=
yled-by-prettify">kwargs</span><span style=3D"color:#660" class=3D"m_797409=
1648130462222styled-by-prettify">):</span><span style=3D"color:#000" class=
=3D"m_7974091648130462222styled-by-prettify"><br>=C2=A0</span><span style=
=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">...</span=
><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettif=
y"><br>=C2=A0</span><span style=3D"color:#660" class=3D"m_79740916481304622=
22styled-by-prettify">...</span><span style=3D"color:#000" class=3D"m_79740=
91648130462222styled-by-prettify"><br>=C2=A0</span><span style=3D"color:#00=
8" class=3D"m_7974091648130462222styled-by-prettify">def</span><span style=
=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"> getData<=
/span><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-pr=
ettify">(</span><span style=3D"color:#000" class=3D"m_7974091648130462222st=
yled-by-prettify">host</span><span style=3D"color:#660" class=3D"m_79740916=
48130462222styled-by-prettify">,</span><span style=3D"color:#000" class=3D"=
m_7974091648130462222styled-by-prettify"> cmd</span><span style=3D"color:#6=
60" class=3D"m_7974091648130462222styled-by-prettify">):</span><span style=
=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=
=A0 =C2=A0html </span><span style=3D"color:#660" class=3D"m_797409164813046=
2222styled-by-prettify">=3D</span><span style=3D"color:#000" class=3D"m_797=
4091648130462222styled-by-prettify"> open</span><span style=3D"color:#660" =
class=3D"m_7974091648130462222styled-by-prettify">(</span><span style=3D"co=
lor:#080" class=3D"m_7974091648130462222styled-by-prettify">"menuRp1.h=
tml"</span><span style=3D"color:#660" class=3D"m_7974091648130462222st=
yled-by-prettify">).</span><span style=3D"color:#000" class=3D"m_7974091648=
130462222styled-by-prettify">read</span><span style=3D"color:#660" class=3D=
"m_7974091648130462222styled-by-prettify">()</span><span style=3D"color:#00=
0" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=A0 =C2=A0</spa=
n><span style=3D"color:#008" class=3D"m_7974091648130462222styled-by-pretti=
fy">yield</span><span style=3D"color:#000" class=3D"m_7974091648130462222st=
yled-by-prettify"> bytes</span><span style=3D"color:#660" class=3D"m_797409=
1648130462222styled-by-prettify">(</span><span style=3D"color:#000" class=
=3D"m_7974091648130462222styled-by-prettify">html</span><span style=3D"colo=
r:#660" class=3D"m_7974091648130462222styled-by-prettify">,</span><span sty=
le=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"> </span=
><span style=3D"color:#080" class=3D"m_7974091648130462222styled-by-prettif=
y">'utf-8'</span><span style=3D"color:#660" class=3D"m_797409164813=
0462222styled-by-prettify">)</span><span style=3D"color:#000" class=3D"m_79=
74091648130462222styled-by-prettify"><br>=C2=A0 =C2=A0client </span><span s=
tyle=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">=3D</=
span><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-pre=
ttify"> paramiko</span><span style=3D"color:#660" class=3D"m_79740916481304=
62222styled-by-prettify">.</span><span style=3D"color:#606" class=3D"m_7974=
091648130462222styled-by-prettify">SSHClient</span><span style=3D"color:#66=
0" class=3D"m_7974091648130462222styled-by-prettify">()</span><span style=
=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=
=A0 =C2=A0client</span><span style=3D"color:#660" class=3D"m_79740916481304=
62222styled-by-prettify">.</span><span style=3D"color:#000" class=3D"m_7974=
091648130462222styled-by-prettify">connect</span><span style=3D"color:#660"=
class=3D"m_7974091648130462222styled-by-prettify">(</span><span style=3D"c=
olor:#000" class=3D"m_7974091648130462222styled-by-prettify">hostname</span=
><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettif=
y">=3D</span><span style=3D"color:#000" class=3D"m_7974091648130462222style=
d-by-prettify">host</span><span style=3D"color:#660" class=3D"m_79740916481=
30462222styled-by-prettify">,</span><span style=3D"color:#000" class=3D"m_7=
974091648130462222styled-by-prettify"> username</span><span style=3D"color:=
#660" class=3D"m_7974091648130462222styled-by-prettify">=3D</span><span sty=
le=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify">user</s=
pan><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-pret=
tify">,</span><span style=3D"color:#000" class=3D"m_7974091648130462222styl=
ed-by-prettify"> password</span><span style=3D"color:#660" class=3D"m_79740=
91648130462222styled-by-prettify">=3D</span><span style=3D"color:#000" clas=
s=3D"m_7974091648130462222styled-by-prettify">pwd</span><span style=3D"colo=
r:#660" class=3D"m_7974091648130462222styled-by-prettify">,</span><span sty=
le=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"> port</=
span><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-pre=
ttify">=3D</span><span style=3D"color:#066" class=3D"m_7974091648130462222s=
tyled-by-prettify">22</span><span style=3D"color:#660" class=3D"m_797409164=
8130462222styled-by-prettify">)</span><span style=3D"color:#000" class=3D"m=
_7974091648130462222styled-by-prettify"><br>=C2=A0 =C2=A0stdin</span><span =
style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">,</s=
pan><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-pret=
tify"> stdout</span><span style=3D"color:#660" class=3D"m_79740916481304622=
22styled-by-prettify">,</span><span style=3D"color:#000" class=3D"m_7974091=
648130462222styled-by-prettify"> stderr </span><span style=3D"color:#660" c=
lass=3D"m_7974091648130462222styled-by-prettify">=3D</span><span style=3D"c=
olor:#000" class=3D"m_7974091648130462222styled-by-prettify"> client</span>=
<span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify=
">.</span><span style=3D"color:#000" class=3D"m_7974091648130462222styled-b=
y-prettify">exec_command</span><span style=3D"color:#660" class=3D"m_797409=
1648130462222styled-by-prettify">(</span><span style=3D"color:#000" class=
=3D"m_7974091648130462222styled-by-prettify">cmd</span><span style=3D"color=
:#660" class=3D"m_7974091648130462222styled-by-prettify">)</span><span styl=
e=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=
=A0 =C2=A0a</span><span style=3D"color:#660" class=3D"m_7974091648130462222=
styled-by-prettify">=3D</span><span style=3D"color:#000" class=3D"m_7974091=
648130462222styled-by-prettify">stdout</span><span style=3D"color:#660" cla=
ss=3D"m_7974091648130462222styled-by-prettify">.</span><span style=3D"color=
:#000" class=3D"m_7974091648130462222styled-by-prettify">readline</span><sp=
an style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">(=
)</span><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-=
prettify"><br>=C2=A0 =C2=A0</span><span style=3D"color:#008" class=3D"m_797=
4091648130462222styled-by-prettify">while</span><span style=3D"color:#000" =
class=3D"m_7974091648130462222styled-by-prettify"> a</span><span style=3D"c=
olor:#660" class=3D"m_7974091648130462222styled-by-prettify">:</span><span =
style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=
=C2=A0 =C2=A0 =C2=A0</span><span style=3D"color:#008" class=3D"m_7974091648=
130462222styled-by-prettify">yield</span><span style=3D"color:#000" class=
=3D"m_7974091648130462222styled-by-prettify"> bytes</span><span style=3D"co=
lor:#660" class=3D"m_7974091648130462222styled-by-prettify">(</span><span s=
tyle=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify">a</sp=
an><span style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prett=
ify">,</span><span style=3D"color:#000" class=3D"m_7974091648130462222style=
d-by-prettify"> </span><span style=3D"color:#080" class=3D"m_79740916481304=
62222styled-by-prettify">'utf-8'</span><span style=3D"color:#660" c=
lass=3D"m_7974091648130462222styled-by-prettify">)</span><span style=3D"col=
or:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=A0 =C2=
=A0 =C2=A0a</span><span style=3D"color:#660" class=3D"m_7974091648130462222=
styled-by-prettify">=3D</span><span style=3D"color:#000" class=3D"m_7974091=
648130462222styled-by-prettify">stdout</span><span style=3D"color:#660" cla=
ss=3D"m_7974091648130462222styled-by-prettify">.</span><span style=3D"color=
:#000" class=3D"m_7974091648130462222styled-by-prettify">readline</span><sp=
an style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">(=
)</span><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-=
prettify"><br>=C2=A0 =C2=A0client</span><span style=3D"color:#660" class=3D=
"m_7974091648130462222styled-by-prettify">.</span><span style=3D"color:#000=
" class=3D"m_7974091648130462222styled-by-prettify">close</span><span style=
=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">()</span>=
<span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify=
"><br>=C2=A0 =C2=A0html </span><span style=3D"color:#660" class=3D"m_797409=
1648130462222styled-by-prettify">=3D</span><span style=3D"color:#000" class=
=3D"m_7974091648130462222styled-by-prettify"> open</span><span style=3D"col=
or:#660" class=3D"m_7974091648130462222styled-by-prettify">(</span><span st=
yle=3D"color:#080" class=3D"m_7974091648130462222styled-by-prettify">"=
menuRp2.html"</span><span style=3D"color:#660" class=3D"m_797409164813=
0462222styled-by-prettify">).</span><span style=3D"color:#000" class=3D"m_7=
974091648130462222styled-by-prettify">read</span><span style=3D"color:#660"=
class=3D"m_7974091648130462222styled-by-prettify">()</span><span style=3D"=
color:#000" class=3D"m_7974091648130462222styled-by-prettify"><br>=C2=A0 =
=C2=A0</span><span style=3D"color:#008" class=3D"m_7974091648130462222style=
d-by-prettify">yield</span><span style=3D"color:#000" class=3D"m_7974091648=
130462222styled-by-prettify"> bytes</span><span style=3D"color:#660" class=
=3D"m_7974091648130462222styled-by-prettify">(</span><span style=3D"color:#=
000" class=3D"m_7974091648130462222styled-by-prettify">html</span><span sty=
le=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">,</span=
><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettif=
y"> </span><span style=3D"color:#080" class=3D"m_7974091648130462222styled-=
by-prettify">'utf-8'</span><span style=3D"color:#660" class=3D"m_79=
74091648130462222styled-by-prettify">)</span><span style=3D"color:#000" cla=
ss=3D"m_7974091648130462222styled-by-prettify"><br>=C2=A0</span><span style=
=3D"color:#008" class=3D"m_7974091648130462222styled-by-prettify">return</s=
pan><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-pret=
tify"> getData</span><span style=3D"color:#660" class=3D"m_7974091648130462=
222styled-by-prettify">(</span><span style=3D"color:#000" class=3D"m_797409=
1648130462222styled-by-prettify">h</span><span style=3D"color:#660" class=
=3D"m_7974091648130462222styled-by-prettify">,</span><span style=3D"color:#=
000" class=3D"m_7974091648130462222styled-by-prettify"> c</span><span style=
=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">)</span><=
span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-prettify"=
><br>test</span><span style=3D"color:#660" class=3D"m_7974091648130462222st=
yled-by-prettify">.</span><span style=3D"color:#000" class=3D"m_79740916481=
30462222styled-by-prettify">_cp_config </span><span style=3D"color:#660" cl=
ass=3D"m_7974091648130462222styled-by-prettify">=3D</span><span style=3D"co=
lor:#000" class=3D"m_7974091648130462222styled-by-prettify"> </span><span s=
tyle=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">{</sp=
an><span style=3D"color:#080" class=3D"m_7974091648130462222styled-by-prett=
ify">'response.stream'</span><span style=3D"color:#660" class=3D"m_=
7974091648130462222styled-by-prettify">:</span><span style=3D"color:#000" c=
lass=3D"m_7974091648130462222styled-by-prettify"> </span><span style=3D"col=
or:#008" class=3D"m_7974091648130462222styled-by-prettify">True</span><span=
style=3D"color:#660" class=3D"m_7974091648130462222styled-by-prettify">}</=
span><span style=3D"color:#000" class=3D"m_7974091648130462222styled-by-pre=
ttify"> </span></code></pre></div></code></div><br><br><p></p></div>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;cherrypy-users" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:cherrypy-users+unsubscribe-/[email protected]" targ=
et=3D"_blank" rel=3D"noreferrer">cherrypy-users+unsubscribe-/[email protected]=
m</a>.<br>
To post to this group, send email to <a href=3D"mailto:cherrypy-users@googl=
egroups.com" target=3D"_blank" rel=3D"noreferrer">cherrypy-users@googlegrou=
ps.com</a>.<br>
Visit this group at <a href=3D"https://groups.google.com/group/cherrypy-use=
rs" target=3D"_blank" rel=3D"noreferrer">https://groups.google.com/group/ch=
errypy-users</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/d/msgid/cherrypy-users/92d0f922-5e40-4a5c-b3d6-a99d10ff0830%40googlegrou=
ps.com?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank" rel=3D=
"noreferrer">https://groups.google.com/d/msgid/cherrypy-users/92d0f922-5e40=
-4a5c-b3d6-a99d10ff0830%40googlegroups.com</a>.<br>
For more options, visit <a href=3D"https://groups.google.com/d/optout" targ=
et=3D"_blank" rel=3D"noreferrer">https://groups.google.com/d/optout</a>.<br=
>
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;cherrypy-users" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:cherrypy-users+unsubscribe-/[email protected]">cher=
rypy-users+unsubscribe-/[email protected]</a>.<br />
To post to this group, send email to <a href=3D"mailto:cherrypy-users@googl=
egroups.com">cherrypy-users-/[email protected]</a>.<br />
Visit this group at <a href=3D"https://groups.google.com/group/cherrypy-use=
rs">https://groups.google.com/group/cherrypy-users</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/d/msgid/cherrypy-users/CAFYONRBoAZFtBsPj1xs3GzLDac5iCvww5zd_wVbEPs4gVs_p=
GQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">https://groups.=
google.com/d/msgid/cherrypy-users/CAFYONRBoAZFtBsPj1xs3GzLDac5iCvww5zd_wVbE=
Ps4gVs_pGQ%40mail.gmail.com</a>.<br />
For more options, visit <a href=3D"https://groups.google.com/d/optout">http=
s://groups.google.com/d/optout</a>.<br />
--000000000000b89d2a058c7a840f--