Python - 从类中访问sys.stdin不起作用

时间:2014-06-24 15:28:46

标签: python multiprocessing stdin

所以我试图在类中读取sys.stdin的管道输入。问题是我在课堂内没有从stdin获得任何输入,但我可以从main()中的类外部获取所有数据。

有没有办法从多处理类中访问sys.stdin?

这是我的代码:

class BufferReader(Process):

    def __init__(self, queue, lock):
        super(BufferReader, self).__init__()
        self.queue = queue
        # number of lines to store in buffer before sending to processes
        self.buffer_size = 200000
        self.lines_buffer = []
        self.lock = lock

    def run(self):
        count = 0
        try:
            # for each line in the stdin
            for line in sys.stdin:
                # strip the line from any whitespace
                stripped = line.strip()

                # if end of line, break
                if not stripped:
                    break

                # add the line to the buffer
                self.lines_buffer.append(stripped)

                # if the buffer is full, process the data, and empty the buffer
                if count == self.buffer_size:
                    self.lock.acquire()
                    self.queue.put(self.lines_buffer)
                    self.lock.release()
                    del self.lines_buffer[:]
                    count = 0

                # increase the line counter
                count += 1
        except KeyboardInterrupt:
            sys.stdout.flush()
            pass

def parse(index, data_queue, lock):

    while not data_queue.empty():
        lock.acquire()
        if data_queue.empty():
            lock.release()
            sys.exit(0)
        result = data_queue.get()
        lock.release()

        with codecs.open("proc-%d" % index, 'w', 'utf-8') as fp:
            for line in result:
                fp.write(line)
            fp.close()
        sys.exit(0)

def main():
    data_queue = Queue()
    lock = Lock()
    br = BufferReader(data_queue, lock)
    br.start()

    # spawn the processes
    procs = [Process(target=parse, args=(i, data_queue, lock))
             for i in range(5)]

    for p in procs:
        p.start()

    br.join()

    for p in procs:
        p.join()

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:4)

使用multiprocessing,您可以在单独的进程中生成工作程序,这些进程具有自己的进程ID,包括它们自己的输入和输出设备。这意味着您在生成的进程中获得的sys.stdin/stdout实例将与主进程的实例不同,尽管您仍然可以读取和写入它们。

至少有两种方法可以解决这个问题:

此外,正如下面的评论中所指出的,如果您不确切知道自己在做什么,那么从多个进程同时读取单个输入流可能会非常棘手。明智的做法是只指定一个进程来读取输入并将数据分发给其他工作人员。或者引入某种循环系统,确保一次只有一个进程可以获取输入数据。使用multiprocessing.Pool进行流程池可能会派上用场。

我建议使用fileinput模块使rading标准输入更容易。