所以我试图在类中读取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()
答案 0 :(得分:4)
使用multiprocessing
,您可以在单独的进程中生成工作程序,这些进程具有自己的进程ID,包括它们自己的输入和输出设备。这意味着您在生成的进程中获得的sys.stdin/stdout
实例将与主进程的实例不同,尽管您仍然可以读取和写入它们。
至少有两种方法可以解决这个问题:
将主进程的sys.stdin/stdout.fileno()
文件描述符传递给生成的进程。您应该能够使用os.fdopen(fileno)
在生成的流程中打开它。
改为使用threading
,因为同一进程的线程共享输入和输出设备。
此外,正如下面的评论中所指出的,如果您不确切知道自己在做什么,那么从多个进程同时读取单个输入流可能会非常棘手。明智的做法是只指定一个进程来读取输入并将数据分发给其他工作人员。或者引入某种循环系统,确保一次只有一个进程可以获取输入数据。使用multiprocessing.Pool
进行流程池可能会派上用场。
我建议使用fileinput
模块使rading标准输入更容易。