Python中的多处理
多处理程序包支持生成过程。它是指加载和执行新的子进程的函数。为了让孩子终止或继续执行并发计算,则当前进程必须使用类似于线程模块的API等待。
介绍
当我们使用Multiprocessing时,首先要创建过程对象。然后,它调用一个start()
方法。
范例程式码
from multiprocessing import Process def display(): print ('Hi !! I am Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
在此示例中,首先我们导入Process类,然后使用该display()
函数启动Process对象。
然后,用start()
方法开始处理,然后用该join()
方法完成处理。
我们还可以使用args关键字将参数传递给函数。
示例
from multiprocessing import Process def display(my_name): print ('Hi !!!' + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
在此示例中,我们创建一个过程,该过程计算数字的立方并将所有结果打印到控制台。
范例程式码
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] p = Process(target=cube, args=('x',)) p.start() p.join print ("Done")
输出结果
Done 3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512
我们也可以一次创建多个流程。
在此示例中,首先我们创建一个进程,即process1,该进程仅计算一个数字的立方,与此同时,第二个进程process2正在检查该数字是偶数还是奇数。
示例
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) def evenno(x): for x in my_numbers: if x % 2 == 0: print('%s is an even number ' % (x)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] my_process1 = Process(target=cube, args=('x',)) my_process2 = Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join() print ("Done")
输出结果
3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512 4 is an even number 6 is an even number 8 is an even number Done
流程之间的沟通
多处理支持管道和队列,这是进程之间的两种通信通道。
管子
在多处理中,当我们要在进程之间进行通信时,在这种情况下使用管道。
示例
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print (parent_conn.recv() ) p.join()
输出结果
['hi !!! I am Python']
管道返回两个连接对象,它们代表管道的两端。每个连接对象都有两种方法send()
,一种是recv()
方法,另一种是方法。
在此示例中,首先我们创建一个过程,该过程打印消息“hi!!IamPython”,然后共享数据。
s列
当我们在进程之间传递数据时,那时我们可以使用Queue对象。
示例
import multiprocessing def evenno(numbers, q): for n in numbers: if n % 2 == 0: q.put(n) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=evenno, args=(range(10), q)) p.start() p.join() while q: print(q.get())
输出结果
0 2 4 6 8
在此示例中,首先创建一个检查天气是否为偶数的函数。如果数字是偶数,则将其插入队列的末尾。然后,我们创建一个队列对象和一个流程对象,然后启动流程。
最后检查队列是否为空。
当我们打印数字时,首先我们打印在队列前面的值,然后打印下一个,依此类推。
锁具
在这种情况下,如果我们希望一次只执行一个进程,则使用Locks。这意味着时间会阻止其他进程执行类似的代码。该过程完成后,将释放锁定。
使用Locks方法的示例
示例
from multiprocessing import Process, Lock def dispmay_name(l, i): l.acquire() print ('Hi', i) l.release() if __name__ == '__main__': my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj'] for name in my_name: Process(target=dispmay_name, args=(my_lock,name)).start()
输出结果
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
记录中
多处理模块还提供了日志记录模块,以确保如果日志记录包不使用锁功能,则在执行过程中进程之间的消息会混合在一起。
示例
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Error has occurred')
在此示例中,首先导入日志记录和多处理模块,然后使用multiprocessing.log_to_stderr()方法。然后调用get_logger()并添加到sys.stderr中,最后我们设置记录器的级别并传递消息。