Python — 多进程
multiprocessing? ??multiprocessing包是Python中的多进程管理包。它可以利用multiprocessing.Process对象来创建一个进程。 ? ? 该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), ? ? run(),join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多 ? ? 线程那样,通过参数传递给各个进程),用以同步进程。 import multiprocessing import os def info(title): print(title) print(__name__) print(‘father‘,os.getppid()) print(‘self‘,os.getpid()) print(‘--------‘) if __name__ == "__main__": # 除了创建的子进程和子进程调用函数,其他的都是脚本主进程 # info(‘hello‘) # 创建一个子进程调用函数 P = multiprocessing.Process(target=info,args=(‘hello python‘,)) P.start() P.join() # 和多线程一样,也是等待的意思 print(‘hello word‘) # 若没有join则会独立运行 RLock?为了保证多线程任务执行时,共享资源的同步,出现了锁这个东西。 ?Lock是阻塞其他线程对共享资源的访问,且同一线程只能acquire一次,如多于一次就出现了死锁,程序无法继续执行。 ?为了保证线程对共享资源的独占,又避免死锁的出现,就有了RLock。RLock允许在同一线程中被多次acquire,线程对共 ?享资源的释放需要把所有锁都release。即n次acquire,需要n次release。 # 当进程进行文件读写操作的时候(关键性操作的时候)需要使用锁.. from multiprocessing import Process,RLock import multiprocessing def _write(str_,lock): print(multiprocessing.current_process().name) # 写入文件 path = ‘/Users/joker/Desktop/joker.txt‘ # with 会自己帮你关掉 with lock: # 路径 模式a:追加 ?join? 描述
? ?语法
str.join(sequence) ? ?参数
? 返回值
? 实例
#!/usr/bin/python # -*- coding: UTF-8 -*- str = "-"; seq = ("a","b","c"); # 字符串序列 print str.join( seq );
a-b-c pipe? ?Linux上,创建管道使用pipe函数,当它执行后,会产生两个文件描述符,分别为读端和写端。单个进程中的管道几乎没 ? ?有任何作用,通常会先调用pipe,然后调用fork,从而创建从父进程到子进程的IPC通道。 import multiprocessing def func(conn): conn.send([‘Joker is a good man‘]) print(‘{} 发送了..‘.format(multiprocessing.current_process().name)) print(‘{} 接受了 {}‘.format(multiprocessing.current_process().name,conn.recv())) conn.close() if __name__ == "__main__": conn_a,conn_b = multiprocessing.Pipe() p1 = multiprocessing.Process(target=func,args=(conn_a,)).start() conn_b.send([1,2,3,4,5,6,7]) # 发送数据给conn_a print(‘main‘,conn_b.recv()) share‘‘‘ 全局变量不共享 1809 [‘a‘,‘b‘,‘c‘] 1810 [1,3] ‘‘‘ # 全局变量不可以进程共享 import multiprocessing import os data = [] def List(): global data data.append(1) data.append(2) data.append(3) print(‘p‘,os.getpid(),data) if __name__ == ‘__main__‘: p = multiprocessing.Process(target=List,args=()).start() # 子进程 data.append(‘a‘) # 脚本主进程 data.append(‘b‘) data.append(‘c‘) print(‘main‘,data) queue? ??queue详情可阅读 https://docs.python.org/zh-cn/3/library/queue.html#queue.Queue.task_done
import multiprocessing import time ############################################################################ # https://docs.python.org/zh-cn/3/library/queue.html#queue.Queue.task_done # ############################################################################ # 一定是要一个放,一个取 # maxsize 设置队列的最大长度. queue = multiprocessing.Queue(maxsize=10) def func1(queue): while 1: print(‘放入..‘) queue.put(100,timeout=3) def func2(queue): while 1: time.sleep(3) res = queue.get() print(res) if __name__ == "__main__": p1 = multiprocessing.Process(target=func1,args=(queue,)) # p2 = multiprocessing.Process(target=func2,args=(queue,)) p1.start() # p2.start() p1.join() # p2.join() 进程列表数据共享# 创建一个共享的列表/数组 # 当你有多个进程需要同时操作某一个数组的时候,你就应该搭建一个共享数组Array. import multiprocessing def func(m,i): m[i] = 10000 def func1(): # Array 是一个对象 list_ = multiprocessing.Array(‘i‘,[1,3]) return list_ if __name__ == "__main__": list_ = func1() print(list_[:]) p1 = multiprocessing.Process(target=func,args=(list_,0)) p2 = multiprocessing.Process(target=func,args=(list_,1)) p1.start() p2.start() p1.join() p2.join() print(list_[:]) 进程字典列表共享import multiprocessing def func(mydict,mylist): mydict["胡旺"] = "牛皮" mydict["lalal"] = "大美女" mylist.append(11) mylist.append(22) mylist.append(33) if __name__ == "__main__": # with multiprocessing.Manager() as MG: # mydict=MG.dict() # mylist=MG.list(range(5)) mydict = multiprocessing.Manager().dict() # [0,1,4] mylist = multiprocessing.Manager().list(range(5)) p = multiprocessing.Process(target=func,args=(mydict,mylist)) p.start() p.join() print(mylist) print(mydict) # print(list(range(5))) # 很牛逼的list (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |