青岛燃烧器,不死邪魂txt,唐治平老婆
python中创建进程模块为:multiprocessing
进程之间数据不是共享的
注意:windowns下进程运行会报错,linux mac 不会出现此问题。解决方法:
将进程启动代码放到main里即可执行,示例代码:
import multiprocessing def task(arg): print(arg) def run(): for i in range(10): # 实例化一个进程 process = multiprocessing.process(target=task,args=(i,)) # 进程启动 process.start() if __name__ == '__main__': run() # main下才能正确执行,不然会报错
join()
:和线程一样,默认会等子进程执行完毕后,代码才会继续往下执行daemon
:
name
:为进程起一个名称multiprocessing.current_process()
:获取当前进程ident/pid
:获取当前进程的id号import time import multiprocessing def task(arg): p = multiprocessing.current_process() # 获取当前进程 print(p.name) # 打印当前进程名称 print(p.ident) # 获取当前进程的id号 print(p.pid) # 获取当前进程的id号 time.sleep(2) print(arg) def run(): print('11111111') #### 进程一 process1 = multiprocessing.process(target=task,args=(1,)) # false 主进程执行完毕后,会等待子进程执行完毕 # true 为不等待子进程执行完毕,主进程执行完毕后,程序就会结束 process1.daemon = false # 为当前进程起一个名称 process1.name = 'proc1' process1.start() # 默认会等进程执行完毕后,代码才会继续往下执行 process1.join() print('22222222') #### 进程二 process2 = multiprocessing.process(target=task, args=(2,)) process2.daemon = false process2.name = 'proc2' process2.start() process2.join() print('33333333') if __name__ == '__main__': run()
##################### 类继承方式创建进程 ##################### import multiprocessing class myprocess(multiprocessing.process): def run(self): print('当前进程', multiprocessing.current_process()) def run(): t1 = myprocess() t1.start() t2 = myprocess() t2.start() if __name__ == '__main__': run()
windows下执行数据共享有点问题,所以使用下面方法可以解决
##################### 进程之间的数据共享 multiprocessing.queue ##################### import multiprocessing q = multiprocessing.queue() # 数据共享可以使用的队列 def task(arg,q): q.put(arg) def run(): for num in range(10): proc = multiprocessing.process(target=task,args=(num,q)) proc.start() while true: v = q.get() print(v) if __name__ == '__main__': run()
linux mac下可以正常执行
示例代码:
import multiprocessing m = multiprocessing.manager() dic = m.dict() def task(arg): dic[arg] = 100 def run(): for num in range(10): proc = multiprocessing.process(target=task,args=(num,)) proc.start() input('>>>') print(dic.values()) if __name__ == '__main__': run()
windowns:
import multiprocessing def task(arg,dic): dic[arg] = 100 if __name__ == '__main__': m = multiprocessing.manager() dic = m.dict() for num in range(10): proc = multiprocessing.process(target=task,args=(num,dic)) proc.start() proc.join() # 一个一个进程等待,执行完了,再执行下一个 print(dic)
import time import multiprocessing def task(arg,dic): time.sleep(2) dic[arg] = 100 if __name__ == '__main__': m = multiprocessing.manager() dic = m.dict() process_list = [] for num in range(10): proc = multiprocessing.process(target=task,args=(num,dic)) proc.start() process_list.append(proc) while true: count = 0 for p in process_list: if not p.is_alive(): count += 1 if count == len(process_list): break print(dic)
概念:不管线程还是进程,锁都是一样的
什么时候用锁: 只有进程或线程操作同一个数据的时候才会进行加锁,如果各自做各自的是不需要加锁的
具体意义看多线程里的锁机制,和进程一样
多线程锁:https://www.cnblogs.com/hybb/p/11512011.html
lock
(一次放行一个)rlock
递归锁(一次放行多个)boundedsemaphore
(一次放n个) 信号量condition
(1次放x个数)动态输入event
(事件)1次放所有import time import multiprocessing lock = multiprocessing.lock() lock = multiprocessing.rlock() lock = multiprocessing.boundedsemaphore() lock = multiprocessing.condition() lock = multiprocessing.event() def task(arg): print('开始了') lock.acquire() time.sleep(2) print(arg) lock.release() def run(): for num in range(1,3): proc = multiprocessing.process(target=task,args=(num,)) proc.start() if __name__ == '__main__': run()
使用的模块 concurrent.futures
和线程池是一样的
示例代码:
import time # 导入进程池模块 from concurrent.futures import processpoolexecutor def task(arg): time.sleep(2) print(arg) if __name__ == '__main__': # 创建一个进程池 pool = processpoolexecutor(5) for num in range(10): pool.submit(task,num)
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
新手学习Python2和Python3中print不同的用法
Python基于os.environ从windows获取环境变量
网友评论