Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用popen执行多处理脚本时输出混乱_Php_C_Multiprocessing_Pipe_Popen - Fatal编程技术网

Php 使用popen执行多处理脚本时输出混乱

Php 使用popen执行多处理脚本时输出混乱,php,c,multiprocessing,pipe,popen,Php,C,Multiprocessing,Pipe,Popen,我一直在尝试使用php中的popen命令执行一个多处理python程序 问题是,输出顺序与预期不符。PHP代码是 if ( ($fp = popen("python multi-processed.py 2>&1", "r")) ) { while( !feof($fp) ) { print fread($fp, 1024); ob_flush(); flush(); } fclose($fp); }

我一直在尝试使用php中的popen命令执行一个多处理python程序

问题是,输出顺序与预期不符。PHP代码是

if ( ($fp = popen("python multi-processed.py 2>&1", "r")) )
{
    while( !feof($fp) )
    {
        print fread($fp, 1024);
        ob_flush();
        flush();
    }
    fclose($fp);
}
else
    print "can't execute command";
但是,当我在shell中运行这个命令时,我将按预期顺序获得输出

python multi-processed.py 2>&1
然后我想到了管道缓冲,并用C编写了下面的代码

FILE *fp = popen("python multi-processed.py -u", "r");
if(fp != NULL)
{
    setvbuf(fp, 0, _IONBF, 0);

    while (!feof(fp))
    {
        fgets(buffer, 1024, fp);
        puts(buffer);
        fflush(fp);
    }
    fclose(fp);
}
在这里,我通过调用setvbuffp,0,_IONBF,0;,来关闭管道缓冲;,然而,输出顺序并不像预期的那样

编辑:添加python文件:multi-processed.py

def foo():
    print 'in foo'
    sleep(2)
    print 'in foo after sleep'

def fun():
    print 'in fun'
    sleep(2)
    print 'in fun after sleep'

if __name__ == '__main__':
    p1 = Process(target=foo, args=())
    p2 = Process(target=fun, args=())
    p1.start()
    p2.start()
    p1.join()
    p2.join()
预期产出:

in foo
in fun
in foo after sleep
in fun after sleep
实际产量:

in foo
in foo after sleep
in fun
in fun after sleep
你能帮我解决这个问题吗

PS:我正在使用windows计算机,无法运行诸如unbuffer之类的命令回答我的问题:

问题是标准输出缓冲。可以通过刷新对标准输出的每次写入来更正

从中,添加以下代码解决了问题

import sys

class Unbuffered(object):
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
   def __getattr__(self, attr):
       return getattr(self.stream, attr)

sys.stdout = Unbuffered(sys.stdout)

多处理程序?或多线程?多处理程序@DeviceFan