网站优化建设上海,网站开发软件有哪些,基于jsp的网上购物系统,开发公司是生产经营单位吗进程Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了multiprocessing模块中提供了Process , Queue , Pipe , Lock , RLock , Event , Condition等组件 , 与threading模块有很多相似之处1.创建进程from multiprocessing im…进程Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了multiprocessing模块中提供了Process , Queue , Pipe , Lock , RLock , Event , Condition等组件 , 与threading模块有很多相似之处1.创建进程from multiprocessing importProcessimporttimedeffunc(name):time.sleep(2)print(hello,name)if __name__ __main__:p Process(targetfunc,args(derek,))p.start()#p.join()print(end...)View Code2.进程间通讯(1)Queue不同进程间内存是不共享的要想实现两个进程间的数据交换。进程间通信有两种主要形式 , 队列和管道from multiprocessing import Process, Queue #Queue是进程排列deff(test):test.put(22) #通过创建的子进程往队列添加数据实线父子进程交互if __name__ __main__:q Queue() #父进程q.put(11)p Process(targetf, args(q,)) #子进程p.start()p.join()print(取到,q.get_nowait())print(取到,q.get_nowait())#父进程在创建子进程的时候就把q克隆一份给子进程#通过pickle序列化、反序列化来达到两个进程之间的交互结果取到11取到22Queue(2)Pipe(管道)The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way).from multiprocessing importProcess, Pipedeff(conn):conn.send(11)conn.send(22)print(from parent:,conn.recv())print(from parent:, conn.recv())conn.close()if __name__ __main__:parent_conn, child_conn Pipe() #生成管道实例可以互相send()和recv()p Process(targetf, args(child_conn,))p.start()print(parent_conn.recv()) #prints 11print(parent_conn.recv()) #prints 22parent_conn.send(33) #parent 发消息给 childparent_conn.send(44)p.join()Pipe3.Manager进程之间是相互独立的 ,Queue和pipe只是实现了数据交互并没实现数据共享Manager可以实现进程间数据共享 。Manager还支持进程中的很多操作 , 比如Condition , Lock , Namespace , Queue , RLock , Semaphore等from multiprocessing importProcess, Managerimportosdeff(d, l):d[os.getpid()]os.getpid()l.append(os.getpid())print(l)if __name__ __main__:with Manager() as manager:d manager.dict() #{} #生成一个字典可在多个进程间共享和传递l manager.list(range(5)) #生成一个列表可在多个进程间共享和传递p_list []for i in range(2):p Process(targetf, args(d, l))p.start()p_list.append(p)for res in p_list: #等待结果res.join()print(d)print(l)View Code4.lockfrom multiprocessing importProcess, Lockdeff(l, i):#l.acquire()print(hello world, i)#l.release()if __name__ __main__:lockLock()for num in range(100):Process(targetf, args(lock, num)).start() #要把lock传到函数的参数l#lock防止在屏幕上打印的时候会乱lock5.进程池进程池内部维护一个进程序列当使用时则去进程池中获取一个进程如果进程池序列中没有可供使用的进程那么程序就会等待直到进程池中有可用进程为止。进程池中有以下几个主要方法apply从进程池里取一个进程并执行apply_asyncapply的异步版本terminate:立刻关闭线程池join主进程等待所有子进程执行完毕必须在close或terminate之后close等待所有进程结束后才关闭线程池from multiprocessing importProcess, PoolimporttimeimportosdefFoo(i):time.sleep(2)print(in process,os.getpid())return i 100defBar(arg):print(--exec done:, arg,os.getpid())if __name__ __main__: #多进程必须加这一句(windows系统)pool Pool(processes3) #允许进程池同时放入3个进程print(主进程,os.getpid())for i in range(10):pool.apply_async(funcFoo, args(i,), callbackBar) #callback回调执行完Foo(),接着执行Bar()#pool.apply(funcFoo, args(i,)) #串行print(end)pool.close()pool.join()#进程池中进程执行完毕后再关闭如果注释那么程序直接关闭。必须先close(),再join()Pool协程1.简介协程(Coroutine) : 是单线程下的并发 , 又称微线程 , 纤程 . 协程是一种用户态的轻量级线程 , 即协程有用户自己控制调度协程拥有自己的寄存器上下文和栈。协程调度切换时将寄存器上下文和栈保存到其他地方在切回来的时候恢复先前保存的寄存器上下文和栈。协程能保留上一次调用时的状态(即所有局部状态的一个特定组合)每次过程重入时就相当于进入上一次调用的状态使用协程的优缺点优点 :协程的切换开销更小 , 属于程序级别的切换 , 更加轻量级单线程内就可以实现并发的效果 , 最大限度利用CPU缺点 :协程的本质是单线程下 , 无法利用多核 , 可以是一个程序开启多个进程 , 每个进程内开启多个线程 , 每个线程内开启协程协程指的是单个线程 , 因而一旦协程出现阻塞 将会阻塞整个线程2.Greenletgreenlet是一个用C实现的协程模块相比与python自带的yield它可以使你在任意函数之间随意切换而不需把这个函数先声明为generator手动切换from greenlet importgreenletdeftest1():print(12)gr2.switch()#到这里切换到gr2执行test2()print(34)gr2.switch()#切换到上次gr2运行的位置deftest2():print(56)gr1.switch()#切换到上次gr1运行的位置print(78)gr1 greenlet(test1) #启动一个协程gr1gr2 greenlet(test2) #启动一个协程gr2gr1.switch()#开始运行gr1greenlet3.GeventGevent 是一个第三方库可以轻松通过gevent实现并发同步或异步编程在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。(1)IO阻塞自动切换importgeventdeffoo():print(Running in foo)gevent.sleep(2)print(阻塞时间最长最后运行)defbar():print(running in bar)gevent.sleep(1)print(foo()还在阻塞这里第二个运行)deffunc3():print(running in func3)gevent.sleep(0)print(其它两个还在IO阻塞先运行)#创建协程实例gevent.joinall([gevent.spawn(foo),#生成gevent.spawn(bar),gevent.spawn(func3),])#遇到IO自动切换结果Runninginfoorunninginbarrunninginfunc3其它两个还在IO阻塞先运行foo()还在阻塞这里第二个运行阻塞时间最长最后运行Process finished with exit code 0View Code由于切换是在IO操作时自动完成所以gevent需要修改Python自带的一些标准库这一过程在启动时通过monkey patch完成(2)爬虫例子from urllib importrequestimportgevent,timefrom gevent importmonkeymonkey.patch_all()#作用把当前程序的所有的io操作给我单独的做上标记deff(url):print(GET: %s %url)resprequest.urlopen(url)dataresp.read()print(%d bytes received from %s. %(len(data), url))#同步需要的时间urls [https://www.python.org/,https://www.yahoo.com/,https://github.com/]time_starttime.time()for url inurls:f(url)print(同步cost,time.time() -time_start)#下面是异步花费的时间async_time_start time.time()gevent.joinall([gevent.spawn(f,https://www.python.org/),gevent.spawn(f,https://www.yahoo.com/),gevent.spawn(f,https://github.com/),])print(异步cost,time.time() -async_time_start)结果GET: https://www.python.org/48954 bytes received from https://www.python.org/.GET: https://www.yahoo.com/491871 bytes received from https://www.yahoo.com/.GET: https://github.com/51595 bytes received from https://github.com/.同步cost4.928282260894775GET: https://www.python.org/GET: https://www.yahoo.com/GET: https://github.com/48954 bytes received from https://www.python.org/.494958 bytes received from https://www.yahoo.com/.51599 bytes received from https://github.com/.异步cost1.4920852184295654IO多路复用详解http://www.cnblogs.com/alex3714/articles/5876749.htmlselectors模块selectors基于select模块实现IO多路复用调用语句selectors.DefaultSelector()特点是根据平台自动选择最佳IO多路复用机制调用顺序epoll poll select做一个socket serversimportselectorsimportsocketsel selectors.DefaultSelector() #根据平台自动选择最佳IO多路复用机制defaccept(sock, mask):conn, addr sock.accept() #Should be ready#print(accepted, conn, from, addr,mask)conn.setblocking(False) #设置为非阻塞IOsel.register(conn, selectors.EVENT_READ, read)#新连接注册read回调函数#将conn和read函数注册到一起当conn有变化时执行read函数defread(conn, mask):data conn.recv(1024) #Should be readyifdata:print(echoing, repr(data), to, conn)conn.send(data)#Hope it wont blockelse:print(closing, conn)sel.unregister(conn)conn.close()socksocket.socket()sock.bind((localhost, 9999))sock.listen(100)sock.setblocking(False)#设置为非阻塞IOsel.register(sock, selectors.EVENT_READ, accept)#将sock和accept函数注册到一起当sock有变化时执行accept函数whileTrue:events sel.select() #默认阻塞有活动连接就返回活动的连接列表监听[(key1,mask1),(key2),(mask2)]for key, mask inevents:callback key.data #accept #1 key.data就是accept # 2 key.data就是readcallback(key.fileobj, mask) #key.fileobj 文件句柄#1 key.fileobj就是sock # 2 key.fileobj就是connserverclientimportsocketimportsysmessages [ bThis is the message.,bIt will be sent,bin parts.,]server_address (localhost, 9999)#Create a TCP/IP socketsocks [ socket.socket(socket.AF_INET, socket.SOCK_STREAM) for i in range(5)]print(socks)#Connect the socket to the port where the server is listeningprint(connecting to %s port %s %server_address)for s insocks:s.connect(server_address)for message inmessages:#Send messages on both socketsfor s insocks:print(%s: sending %s %(s.getsockname(), message) )s.send(message)#Read responses on both socketsfor s insocks:data s.recv(1024)print( %s: received %s %(s.getsockname(), data) )if notdata:print( closing socket, s.getsockname() )mutlti conn socket client