<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=utf-8" http-equiv=Content-Type><!-- flashmail style begin -->
<STYLE type=text/css>
body {border-width:0;margin:0}
img {border:0;margin:0;padding:0}
</STYLE>
<BASE target=_blank><!-- flashmail style end -->
<META name=GENERATOR content="MSHTML 11.00.10240.16603"></HEAD>
<BODY 
style="BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 10.5pt; FONT-FAMILY: 微软雅黑; BORDER-RIGHT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; COLOR: #000000; MARGIN: 12px; LINE-HEIGHT: 1.5; BORDER-TOP-WIDTH: 0px" 
marginheight="0" marginwidth="0">
<DIV>I can only reproduce the <STRONG>OSError</STRONG> problem. Maybe the CPU 
100% is not really a dead lock, but rather some kind of automatic crash report? 
Although it is quite easy to crash the program with os.urandom, it 
only stops responding when the crash happens in system libraries like 
multiprocessing or email.</DIV>
<DIV> </DIV>
<DIV>The posix.urandom problem is quite easy to reproduce:</DIV>
<DIV> </DIV>
<DIV>#!/usr/bin/pypy<BR>import os<BR>os.urandom(16)<BR>def 
test():<BR>    print repr(os.urandom(16))<BR>import 
daemon<BR>import sys<BR>if __name__ == '__main__':<BR>    with 
daemon.DaemonContext(initgroups=False, 
stderr=sys.stderr,stdout=sys.stdout):<BR>        
test()</DIV>
<DIV> </DIV>
<DIV>(stderr and stdout is kept open to show console messages in the daemon. 
initgroups=False is a workaround on python-daemon not working in 
Python2.6)</DIV>
<DIV> </DIV>
<DIV>Or, with module random:</DIV>
<DIV> </DIV>
<DIV>#!/usr/bin/pypy<BR>import random<BR>def test():<BR>    
random.Random()<BR>import daemon<BR>import sys<BR>if __name__ == 
'__main__':<BR>    with daemon.DaemonContext(initgroups=False, 
stderr=sys.stderr,stdout=sys.stdout):<BR>        
test()<BR></DIV>
<DIV>And when run scripts with pypy:</DIV>
<DIV> </DIV>
<DIV>pypy test3.py</DIV>
<DIV> </DIV>
<DIV>it crashes with OSError:</DIV>
<DIV>Traceback (most recent call last):<BR>  File "test2.py", line 13, in 
<module><BR>    test()<BR>  File "test2.py", line 6, 
in test<BR>    random.Random()<BR>  File 
"/opt/pypy-4.0.1-linux_x86_64-portable/lib-python/2.7/random.py", line 95, in 
__init__<BR>    self.seed(x)<BR>  File 
"/opt/pypy-4.0.1-linux_x86_64-portable/lib-python/2.7/random.py", line 111, in 
seed<BR>    a = long(_hexlify(_urandom(2500)), 16)<BR>OSError: 
[Errno 9] Bad file descriptor</DIV>
<DIV> </DIV>
<DIV>It is still not clear why it causes dead loop (or long-time no responding) 
in multiprocessing (should have thrown an ImportError) and the exact condition 
for the file descriptor of /dev/urandom appears (just call os.urandom and import 
random does not reproduce the result), but I believe it is definitely 
linked to the problem.</DIV>
<DIV> </DIV>
<DIV style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; COLOR: #c0c0c0" 
align=left>2015-12-23 
<HR id=SignNameHR 
style="BORDER-TOP: #c0c0c0 1px solid; HEIGHT: 1px; BORDER-RIGHT: 0px; WIDTH: 122px; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px" 
align=left>
<SPAN id=_FlashSignName>hubo</SPAN> </DIV>
<HR 
style="BORDER-TOP: #c0c0c0 1px solid; HEIGHT: 1px; BORDER-RIGHT: 0px; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px">

<BLOCKQUOTE id=ntes-flashmail-quote 
style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; PADDING-LEFT: 0px; MARGIN-LEFT: 0px">
  <DIV><STRONG>发件人:</STRONG>Maciej Fijalkowski <fijall@gmail.com></DIV>
  <DIV><STRONG>发送时间:</STRONG>2015-12-23 20:07</DIV>
  <DIV><STRONG>主题:</STRONG>Re: Re: [pypy-dev] Dead loop occurs when using 
  python-daemon and multiprocessing together in PyPy 4.0.1</DIV>
  <DIV><STRONG>收件人:</STRONG>"hubo"<hubo@jiedaibao.com></DIV>
  <DIV><STRONG>抄送:</STRONG>"pypy-dev"<pypy-dev@python.org></DIV>
  <DIV> </DIV>
  <DIV>
  <DIV dir=ltr>That's very interesting, can you produce a standalone example 
  that does not use multiprocessing? That would make it much easier to fix the 
  bug (e.g. os.fork followed by os.urandom failing)</DIV>
  <DIV class=gmail_extra><BR>
  <DIV class=gmail_quote>On Wed, Dec 23, 2015 at 1:54 PM, hubo <SPAN 
  dir=ltr><<A href="mailto:hubo@jiedaibao.com" 
  target=_blank>hubo@jiedaibao.com</A>></SPAN> wrote:<BR>
  <BLOCKQUOTE class=gmail_quote 
  style="PADDING-LEFT: 1ex; BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex"><U></U>
    <DIV 
    style="BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 10.5pt; FONT-FAMILY: 微软雅黑; BORDER-RIGHT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; COLOR: #000000; MARGIN: 12px; LINE-HEIGHT: 1.5; BORDER-TOP-WIDTH: 0px" 
    marginheight="0" marginwidth="0">
    <DIV>Thanks for the response. Should I put it directly in the bug 
    tracker?</DIV>
    <DIV> </DIV>
    <DIV>FYI, I've located the reason to be the incompatibility with 
    python-daemon (or rather the standard unix-daemon behavior) and 
    PyPy <STRONG>posix.urandom</STRONG> implementation. </DIV>
    <DIV> </DIV>
    <DIV>It seems that in PyPy 4.0.1, when module <STRONG>random</STRONG> 
    loaded, a file descriptor is created on /dev/urandom. I think PyPy 
    implementation use the shared descriptor to read from /dev/urandom. Sadly 
    when python-daemon fork the process and turns it into an unix daemon, it 
    closes all the currently open file descriptors. After that all os.urandom 
    calls failed with OSError. I think maybe the other functions of Random class 
    is also using the file descriptor in C code and just never detects 
    if the return value is 0, and causes the dead loop.</DIV>
    <DIV> </DIV>
    <DIV>I think the problem will be solved if the 
    implementation re-open the handle when it is 
    closed somehow.</DIV>
    <DIV> </DIV>
    <DIV>multiprocessing is using random internally. Also there are lots of 
    other modules using random, like email etc. The dead loop occurs when you 
    use any of the libraries in a daemon.</DIV>
    <DIV> </DIV>
    <DIV> </DIV>
    <DIV> </DIV>
    <DIV style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; COLOR: #c0c0c0" 
    align=left>2015-12-23 
    <HR 
    style="BORDER-TOP: #c0c0c0 1px solid; BORDER-RIGHT: 0px; WIDTH: 122px; BORDER-BOTTOM: 0px; MIN-HEIGHT: 1px; BORDER-LEFT: 0px" 
    align=left>
    <SPAN>hubo</SPAN> </DIV>
    <HR 
    style="BORDER-TOP: #c0c0c0 1px solid; BORDER-RIGHT: 0px; BORDER-BOTTOM: 0px; MIN-HEIGHT: 1px; BORDER-LEFT: 0px">

    <BLOCKQUOTE 
    style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; PADDING-LEFT: 0px; MARGIN-LEFT: 0px">
      <DIV><STRONG>发件人:</STRONG>Maciej Fijalkowski <<A 
      href="mailto:fijall@gmail.com" 
target=_blank>fijall@gmail.com</A>></DIV>
      <DIV><STRONG>发送时间:</STRONG>2015-12-23 19:35</DIV>
      <DIV><STRONG>主题:</STRONG>Re: [pypy-dev] Dead loop occurs when using 
      python-daemon and multiprocessing together in PyPy 4.0.1</DIV>
      <DIV><STRONG>收件人:</STRONG>"hubo"<<A href="mailto:hubo@jiedaibao.com" 
      target=_blank>hubo@jiedaibao.com</A>></DIV>
      <DIV><STRONG>抄送:</STRONG>"pypy-dev"<<A 
      href="mailto:pypy-dev@python.org" 
      target=_blank>pypy-dev@python.org</A>></DIV>
      <DIV>
      <DIV class=h5>
      <DIV> </DIV>
      <DIV>
      <DIV dir=ltr>Hi hubo 
      <DIV><BR></DIV>
      <DIV>Can you put it as a bug report? Those things get easily lost on the 
      mailing list (and sadly I won't look at it right now, multiprocessing 
      scares me)</DIV></DIV>
      <DIV class=gmail_extra><BR>
      <DIV class=gmail_quote>On Wed, Dec 23, 2015 at 12:03 PM, hubo <SPAN 
      dir=ltr><<A href="mailto:hubo@jiedaibao.com" 
      target=_blank>hubo@jiedaibao.com</A>></SPAN> wrote:<BR>
      <BLOCKQUOTE class=gmail_quote 
      style="PADDING-LEFT: 1ex; BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex"><U></U>
        <DIV 
        style="BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 10.5pt; FONT-FAMILY: 微软雅黑; BORDER-RIGHT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; COLOR: #000000; MARGIN: 12px; LINE-HEIGHT: 1.5; BORDER-TOP-WIDTH: 0px" 
        marginheight="0" marginwidth="0"><U></U>
        <DIV>Hello devs,</DIV>
        <DIV> </DIV>
        <DIV>A (possible) dead loop is found when I use python-daemon and 
        multiprocessing together in PyPy 4.0.1, which does not appear in 
        Python(2.6 or 2.7). Also it does not appear in earlier PyPy versions 
        (2.0.2)</DIV>
        <DIV> </DIV>
        <DIV><STRONG>Reproduce</STRONG>:</DIV>
        <DIV> </DIV>
        <DIV>First install python-daemon:</DIV>
        <DIV>pypy_pip install python-daemon</DIV>
        <DIV> </DIV>
        <DIV>Use the following test script (also available in attachment):</DIV>
        <DIV> </DIV>
        <DIV>#!/usr/bin/pypy<BR>import daemon<BR>import multiprocessing<BR>def 
        test():<BR>    q = multiprocessing.Queue(64)<BR>if 
        __name__ == '__main__':<BR>    with 
        daemon.DaemonContext():<BR>        
        test()</DIV>
        <DIV> </DIV>
        <DIV>When executing the script with pypy:</DIV>
        <DIV>pypy test.py</DIV>
        <DIV> </DIV>
        <DIV>The background service does not exit, and is consuming 100% 
        CPU:</DIV>
        <DIV>ps aux | grep pypy<BR>root      7769 
        99.1  0.5 235332 46812 ?        
        R    17:52   2:09 pypy 
        test.py<BR>root      7775  0.0  0.0 
        103252   804 pts/1    S+   
        17:54   0:00 grep pypy</DIV>
        <DIV> </DIV>
        <DIV><IMG src="cid:flashmail$lYue1bp0$1450876463__0@nmmp"></DIV>
        <DIV> </DIV>
        <DIV> </DIV>
        <DIV>Executing the script with python:</DIV>
        <DIV>python2.7 test.py</DIV>
        <DIV>And the background service normally exits.</DIV>
        <DIV> </DIV>
        <DIV><STRONG>Environment:</STRONG></DIV>
        <DIV>I'm using CentOS 6.5, with portable PyPy distribution for linux (<A 
        href="https://bitbucket.org/squeaky/portable-pypy/downloads/pypy-4.0.1-linux_x86_64-portable.tar.bz2" 
        target=_blank>https://bitbucket.org/squeaky/portable-pypy/downloads/pypy-4.0.1-linux_x86_64-portable.tar.bz2</A>)</DIV>
        <DIV>I run the script on system built-in python (python 2.6.6), a 
        compiled CPython (2.7.11), and pypy from epel-release(pypy 2.0.2, python 
        2.7.2), and the problem does not appear. Though the compiled CPython is 
        2.7.11 and PyPy 4.0.4 is python 2.7.10, I think that does not 
        matter much.</DIV>
        <DIV> </DIV>
        <DIV>Please contact if you have any questions or ideas.</DIV>
        <DIV> </DIV>
        <DIV> </DIV>
        <DIV style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; COLOR: #c0c0c0">
        <DIV align=left>2015-12-23</DIV>
        <HR 
        style="BORDER-TOP: #c0c0c0 1px solid; BORDER-RIGHT: 0px; WIDTH: 122px; BORDER-BOTTOM: 0px; MIN-HEIGHT: 1px; BORDER-LEFT: 0px" 
        align=left>
        <SPAN><FONT color=#888888><SPAN>hubo</SPAN> 
        </FONT></SPAN></DIV><U></U></DIV><BR>_______________________________________________<BR>pypy-dev 
        mailing list<BR><A href="mailto:pypy-dev@python.org" 
        target=_blank>pypy-dev@python.org</A><BR><A 
        href="https://mail.python.org/mailman/listinfo/pypy-dev" rel=noreferrer 
        target=_blank>https://mail.python.org/mailman/listinfo/pypy-dev</A><BR><BR></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></DIV></BLOCKQUOTE></DIV></BLOCKQUOTE></DIV><BR></DIV></DIV></BLOCKQUOTE></BODY></HTML>