我是靠谱客的博主 潇洒唇膏,最近开发中收集的这篇文章主要介绍day10_进程、协程、异步IO、多路复用进程进程间数据交互进程间数据交互及共享进程池的使用协程协程遇到IO操作自动切换协程gevent并发爬网页事件驱动介绍阻塞IO, 非阻塞IO, 同步IO,异步IO介绍阻塞IO, 非阻塞IO, 同步IO,异步IO介绍2select poll epoll IO多路复用介绍及实现select IO多路复用代码实例epoll IO多路复用实现单线程支持上万并发代码实例,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
进程
之前我们了解的线程,接下来我们学习多进程,进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程。进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的。
线程的使用场景:
1、IO操作:不占用cpu的操作,比如:从磁盘上读块数据,从网络读块数据,从内存上读块数据都算是io的操作。
2、计算是占用cpu的,比如:计算1+1。线程利用上下文切换,也是消耗资源的。如果大量计算,用多线程就不快了,线程之前的来回切换,运算不要用。
3、python的多线程不适合cpu的密集型操作的任务。但是,适合io密集型的任务,比如:socket_server 的使用。
进程的定义
用muliprocessing这个包中的Process来定义多进程,跟定义多线程差不多。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:liyanan
from multiprocessing import Process#导入进程模块
import time
def run(name):
time.sleep(2)
print('hello',name)
if __name__ == '__main__':
p_obj_list = list()#存放进程对象
for i in range(10):#启动10个进程
p=Process(target=run,args=('li{0}'.format(i),))#产生一个进程实例
p.start()#启动进程
p_obj_list.append(p)
for p in p_obj_list:
p.join()#等待结束进程
进程中嵌入线程
在进程中去嵌入线程
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:liyanan
from multiprocessing import Process
import time,threading
def thead_run(name):#定义线程的方法
print("{0}:{1}".format(name,threading.get_ident()))
def run(name):
time.sleep(2)
print('hello',name)
t= threading.Thread(target=thead_run,args=(name,))#嵌入线程
t.start()#执行线程
if __name__ == '__main__':
p_obj_list = list()
for i in range(10):
p = Process(target=run,args=("li{0}".format(i),))
p.start()
p_obj_list.append(p)
for p in p_obj_list:
p.join()
父子进程
每个子进程都是由一个父进程启动的,即便是我们这种程序也是有一个父进程的
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:liyanan
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:',__name__)
print('parent process:',os.getppid())
print('proocess id:',os.getpid())
print('nn')
def f(name):
info('