print('All subprocesses done.') #3、子进程,用于调用一个外部进程(例如一条命令),需要控制子进程的输入和输出 import subprocess print('$ nslookup www.python.org') r = subprocess.call(['nslookup', 'www.python.org']) print('Exit code:', r) print('$ nslookup') p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = p.communicate( b'set q=mx\npython.org\nexit\n' ) #相当于在命令行执行命令nslookup,然后手动输入:set q=mx python.org exit print(output.decode('utf-8')) print('Exit code:', p.returncode) #4、进程间通信,Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。由于Windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去 from multiprocessing import Process, Queue import os, time, random def write(q): #写数据进程执行的代码: print('Process to write: %s' % os.getpid()) for value in ['A', 'B', 'C']: print('Put %s to queue...' % value) q.put(value) time.sleep(random.random())
def long_time_task(name): print('Run task %s (%s)...' % (name, os.getpid())) start = time.time() time.sleep(random.random() * 3) end = time.time() print('Task %s runs %0.2f seconds.' % (name, (end - start))) if __name__ == '__main__': print('Parent process %s:' % os.getpid()) p = Pool(4) for i in range(5): p.apply_async(long_time_task, args=(i, )) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.') #控制进程的输入与输出 import subprocess print('$ nslookup www.python.org') r = subprocess.call(['nslookup', 'www.python.org']) print('Exit code', r) #子进程还需要输入 print('$ nslookup') p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = p.communicate(b'set q=mx\npython.org\nexit\n') print(output.decode('utf-8')) print('Exit code:', p.returncode) #进程间通信 from multiprocessing import Process, Queue import os, time, random #写数据进程执行的代码 def write(q): print('Process to write:%s' % os.getpid()) for value in ['A', 'B', 'C']: print('Put %s to queue...' % value) q.put(value) time.sleep(random.random()) #读数据进程执行的代码 def read(q): print('Process to read: %s' % os.getpid()) while True: value = q.get(True) print('Get % from queue.' % value) if __name__ == '__main__': #父进程创建Queue,并传递给各个子进程 q = Queue() pw = Process(target=write, args=(q, )) pr = Process(target=read, args=(q, )) #启动子进程pw,写入 pw.start() #启动子进程pr,读取 pr.start() #等待pw结束 pw.join() #pr进程里是死循环,无法等待其结束,只能强行终止 pr.terminate()
return 'done {0}'.format(name) if __name__ == '__main__': print('Parent process {0} is running'.format(os.getpid())) p = Pool(4) result = [] for i in range(5): result.append(p.apply_async(long_time_task, (i, ))) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done') # print(result) for res in result: print(res.get()) import subprocess print('nslookup www.python.org') res = subprocess.call(['nslookup', 'www.python.org']) print('Exit code:{0}'.format(res)) print('$ nslookup') p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = p.communicate(b'set q=mx\npython.org\nexit\n') print(output.decode('utf-8')) print('Exit code {0}'.format(p.returncode))
end = time.time() print('Task {0} {1:.2} seconds'.format(name, end-start)) return 'done {0}'.format(name) if __name__ == '__main__': print('Parent process {0} is running'.format(os.getpid())) p = Pool(4) result = [] for i in range(5): result.append(p.apply_async(long_time_task, (i,))) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done') # print(result) for res in result: print(res.get()) import subprocess print('nslookup www.python.org') res = subprocess.call(['nslookup','www.python.org']) print('Exit code:{0}'.format(res)) print('$ nslookup') p = subprocess.Popen(['nslookup'],stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = p.communicate(b'set q=mx\npython.org\nexit\n') print(output.decode('utf-8')) print('Exit code {0}'.format(p.returncode))