晚上劳累来看看python多进程吧(详细)~

听了林海深老师的课程后对python多进程的理念又有了更多的了解,下面来与大家分享

一 、什么是进程?

进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。

二、谈谈进程与程序的区别:

程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。

需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放海贼王,一个可以播放妖精的尾巴。

三、了解并发与并行的概念:

ps:无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务

1、并发:

是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

2、并行:

同时运行,只有具备多个cpu才能实现并行

四、了解同步,异步,阻塞与非阻塞

同步与异步描述的是任务的提交方式

同步:任务提交之后,原地等待任务的返回结果,等待的过程中不做任何事(干等)。程序层面上表现出来的感觉就是卡住了

异步:任务提交之后,不原地等待任务的返回结果,直接去做其它事情

阻塞与非阻塞描述的是程序的运行状态

阻塞:阻塞态(

阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞:就绪态、运行态

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。

上述概念的组合最高效的是异步非阻塞

五、看完上述概念后接下来为大家介绍创建进程的两种方式:

1、第一种方式

from multiprocessing import Process
import time


def task(name):
    print('======进程2======')
    print('%s is running' % name)
    time.sleep(2)
    print('%s is over' % name)


if __name__ == '__main__':
    # 1、创建一个对象
    p = Process(target=task, args=('egon',))
    # 2、开启进程
    p.start()# =>告诉操作系统帮你创建一个进程
    print('======进程1======')
    print('hahahhaha')
    # 运行代码后相当于有两个进程在执行

'''
windows操作系统下创建进程一定要在main内创建
因为windows下创建进程类似于模块导入的方式
会从上往下一次执行代码
Linux中则是直接将代码完整的拷贝一份
'''

2、第二种方式  类的继承

from multiprocessing import Process
import time


class MyProcess(Process):
    def run(self):
        print('======进程2======')
        print('hello girl')
        time.sleep(2)
        print('get out!')

if __name__ == '__main__':
    p=MyProcess()
    p.start()
    print('======进程1======')
    print('hahahhaha')

'''
总结:
创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
一个进程对应在内存中就是一块独立的内存空间
多个进程对应在内存中就是多块独立的内存空间
进程与进程之间数据默认情况下是无法直接进行交互的,如果想交互可以借助第三方工具 模块
'''

六、jion 方法:

'''
jion 方法:
jion方法是让主进程等待子进程代码运行结束后,再继续运行。不影响其他子进程的执行

'''

from multiprocessing import Process
import time

def task(name):
    print('======进程2======')
    print('%s is running' % name)
    time.sleep(2)
    print('%s is over' % name)


if __name__ == '__main__':
    p1 = Process(target=task, args=('egon',))
    p1.start()
    p1.join()  # 主进程等待子进程p运行结束后再继续往后执行
    print('======进程1======')
    print('hahahhaha')


'''
运行结果:
======进程2======
egon is running
egon is over
======进程1======
hahahhaha

'''
from multiprocessing import Process
import time

def task(name):
    print('======进程2======')
    print('%s is running' % name)
    time.sleep(2)
    print('%s is over' % name)


if __name__ == '__main__':
    p1 = Process(target=task, args=('egon',))
    p2 = Process(target=task, args=('json',))
    p1.start()
    p2.start()
    # p.join()  # 主进程等待子进程p运行结束后再继续往后执行
    print('======进程1======')
    print('hahahhaha')

'''
运行结果:
======进程2======
egon is running
egon is over
======进程1======
hahahhaha

'''
from multiprocessing import Process
import time

def task(name):
    print('======进程2======')
    print('%s is running' % name)
    time.sleep(2)
    print('%s is over' % name)


if __name__ == '__main__':
    p1 = Process(target=task, args=('egon',))
    p2 = Process(target=task, args=('json',))
    p1.start()
    p2.start()
    # p.join()  # 主进程等待子进程p运行结束后再继续往后执行
    print('======进程1======')
    print('hahahhaha')

'''
运行结果:
======进程1======
hahahhaha
======进程2======
egon is running
======进程2======
json is running
egon is over
json is over
不是按顺序执行的,仅仅是告诉操作系统要创建进程

'''
from multiprocessing import Process
import time

def task(name,n):
    print('======进程2======')
    print('%s is running' % name)
    time.sleep(n)
    print('%s is over' % name)


if __name__ == '__main__':
    p1 = Process(target=task, args=('egon',1))
    p2 = Process(target=task, args=('json',2))
    start_time=time.time()
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print('======进程1======')
    print('hahahhaha')
    print(time.time()-start_time)# 相当于多核CPU同时工作,时间为进程最长的时间

'''
运行结果:
======进程2======
egon is running
======进程2======
json is running
egon is over
json is over
======进程1======
hahahhaha
2.409942865371704 ==》相当于p2 = Process(target=task, args=('json',2))中的time.sleep(2)=》2s
'''


# 精简版
from multiprocessing import Process
import time

def task(name,n):

    print('%s is running' % name)
    time.sleep(n)
    print('%s is over' % name)


if __name__ == '__main__':
    start_time=time.time()
    p_list=[]
    for i in range(1,4):
        p=Process(target=task,args=('子进程%s'%i,i))
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()
    print('======主进程======')
    print('hahahhaha')
    print(time.time()-start_time)
'''
运行结果:
子进程1 is running
子进程2 is running
子进程3 is running
子进程1 is over
子进程2 is over
子进程3 is over
======主进程======
hahahhaha
3.489610195159912
'''

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值