我正在使用子进程模块启动子进程并连接到它的输出流(stdout).我希望能够在其标准输出上执行非阻塞读取.有没有办法让.readline非阻塞或在我调用之前检查流上是否有数据.readline?我希望这是可移植的,或至少在Windows和Linux下工作.
这是我现在如何做到的(.readline如果没有数据可用,则阻止它):
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud) 我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器.我的并行化非常简单,因为程序的所有并行"线程"都是独立的,并将它们的输出写入单独的文件.我不需要线程来交换信息,但是我必须知道线程何时完成,因为我的管道的某些步骤依赖于它们的输出.
可移植性很重要,因为我希望在Mac,Linux和Windows上运行任何Python版本.鉴于这些约束,哪个是最适合实现它的Python模块?我试图在线程,子进程和多处理之间做出决定,这些都似乎提供了相关的功能.
有什么想法吗?我想要最简单的便携式解决方案.
如何使用线程和子进程模块生成并行bash进程?当我启动线程时,第一个答案就在这里:如何在Python中使用线程?,bash进程按顺序而不是并行运行.
我cat | zgrep在远程服务器上运行几个命令并单独收集它们的输出以进行进一步处理:
class MainProcessor(mp.Process):
def __init__(self, peaks_array):
super(MainProcessor, self).__init__()
self.peaks_array = peaks_array
def run(self):
for peak_arr in self.peaks_array:
peak_processor = PeakProcessor(peak_arr)
peak_processor.start()
class PeakProcessor(mp.Process):
def __init__(self, peak_arr):
super(PeakProcessor, self).__init__()
self.peak_arr = peak_arr
def run(self):
command = 'ssh remote_host cat files_to_process | zgrep --mmap "regex" '
log_lines = (subprocess.check_output(command, shell=True)).split('\n')
process_data(log_lines)
Run Code Online (Sandbox Code Playgroud)
但是,这会导致子进程('ssh ... cat ...')命令的顺序执行.第二个峰值等待第一个完成,依此类推.
如何修改此代码以便子进程调用并行运行,同时仍能够单独收集每个的输出?