from multiprocessing import Process def show(name): print("Process name is " + name)if __name__ == "__main__": proc = Process(target=show, args=('subprocess',)) proc.start() proc.join()
方法2:继承Process来自定义进程类,重写run方法
代码如下:
from multiprocessing import Processimport timeclass MyProcess(Process): def __init__(self, name): super(MyProcess, self).__init__() self.name = name def run(self): print('process name :' + str(self.name)) time.sleep(1)if __name__ == '__main__': for i in range(3): p = MyProcess(i) p.start() for i in range(3): p.join()
from multiprocessing import Process, Pipe def show(conn): conn.send('Pipe 用法') conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() pro = Process(target=show, args=(child_conn,)) pro.start() print(parent_conn.recv()) pro.join()
2.3 进程池
创建多个进程,我们不用傻傻地一个个去创建。我们可以使用Pool模块来搞定。
Pool 常用的方法如下:
具体用法见示例代码:
from multiprocessing import Pooldef show(num): print('num : ' + str(num))if __name__=="__main__": pool = Pool(processes = 3) for i in xrange(6): # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去 pool.apply_async(show, args=(i, )) print('====== apply_async ======') pool.close() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束 pool.join()
3 Python 多线程
3.1 GIL
其他语言,CPU 是多核时是支持多个线程同时执行。但在 Python 中,无论是单核还是多核,同时只能由一个线程在执行。其根源是 GIL 的存在。
GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 Python 设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且在一个 Python 进程中,GIL 只有一个。拿不到通行证的线程,就不允许进入 CPU 执行。
import threadingimport timenum = 0mutex = threading.Lock()class MyThread(threading.Thread): def run(self): global num time.sleep(1) if mutex.acquire(1): num = num + 1 msg = self.name + ': num value is ' + str(num) print(msg) mutex.release()if __name__ == '__main__': for i in range(5): t = MyThread() t.start()