python网编_进程之开启一个进程

摘要:
例如pycharm作为一个进程,在pycharm里启动的进程就是子进程,此时pycharm就是父进程子进程:与父进程是相对的主进程:一般我们直接执行的那个程序就是主进程。这很违背我们的本意,所以通过主进程中加入if__main__==__name__:来控制主进程只开启一个子进程;linux和mac系统是通过copy父进程的内存解决这个问题,也就是说会把Process.start()之前的内存copy到子进程中。②如何开启多个子进程?
直接上代码:
importtime,os
from multiprocessing importProcess  # 导入模块
deffunc():
    time.sleep(1)
    print('hello',os.getpid())  #os.getpid()的作用是打印进程id
if __name__ == '__main__':
    Process(target=func).start()  #开启了一个新的进程,然后在这个新的进程里执行了func中的代码
    time.sleep(1)
    print('hello2',os.getpid()) #打印进程id
执行结果:
hello2 18448
hello 1972
这就开启了一个进程,可以通过进程id来进行测试,两个进程id不一样说明是同时有两个进程在工作,实现了异步的效果。
这里有几个概念:
父进程:父进程执行的过程中创建了子进程。例如pycharm作为一个进程,在pycharm里启动的进程就是子进程,此时pycharm就是父进程
子进程:与父进程是相对的
主进程:一般我们直接执行的那个程序就是主进程。
这里有几个问题:
为什么一定要加if__name__ == __main__:这句
如果mac和linux系统没有这句话仍然不会报错,这个是因为不同的操作系统启动进程的方式不同
windows开启一个子进程的方式:由于进程间数据隔离,所以理论上讲子进程无法应用父进程的数据,也无法运行父进程中的任何代码是import父进程所在的文件,所以通过import父进程所在的文件的方式加载一遍父进程的所有数据,所以如果不加这句话的话,开启的子进程中也会执行Process(target=func).star()
那么就会一直开子进程直到系统受不了。这很违背我们的本意,所以通过主进程中加入if __main__ == __name__:来控制主进程只开启一个子进程;
linux和mac系统是通过copy父进程的内存解决这个问题,也就是说会把Process(target=func).start()之前的内存copy到子进程中。这个时候要运行func(),因为内存中已经有了func()所以直接运行就OK了
总结:有与操作系统不同,导致开启子进程的方式有__main__的区别,莫慌,见到这样的错误,加上if __main__ == __name__:即可。
②如何开启多个子进程?(不信可通过os.getpid()证明一下,我信了所以不写)
if __main__ == __name__:
            for i in range(10):
                Process(target=func).start()
        开子进程也可以这样写:  
if __main__ == __name__:
            for i in range(10):
                p = Process(target=func)  # 通过Process类实例化一个对象p
                p.start()  # 开启进程
③如何给子进程传参?
我们说各进程之间数据隔离,那么如何传参呢?
 deffunc(name):
            print('hello',name)
        
        if __name__ == __main__:
            p = Process(target=func,args=('carrie'))  #通过args传入一个元组,target对应的函数有几个参数就放到这个元组里
                p.start()  #start是非阻塞的 如果开启多个子进程的话 并非是挨个的开启 而是对操作系统说:请帮我开启n个子进程,
                           #然后就去干自己该干的事情了。所以操作系统什么时候开,先开谁后开谁都不管。
  ④子进程可以有返回值么?
理论上来讲子进程不应该有返回值,因为内存隔离的问题,子进程中的函数的返回值无法传给父进程
霸特,IPC机制,通过进程间通信机制可以把返回值返回给主进程

免责声明:文章转载自《python网编_进程之开启一个进程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux 命令-1python selenium 编码问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作系统——进程,线程,锁

基本概念 状态、地址空间 三种基本状态 —— 就绪、运行、阻塞 进程控制块PCB(Process Control Block) 进程描述信息(如PID); 进程控制&管理信息(状态、优先级等); 源分配清单(地址空间状况、fd等); 处理其相关信息(各寄存器的值等) 进程存在的标识,在Linux系统中是task_struct,task_s...

Python 用SMTP发送邮件

一、简介  上面介绍了传统邮件的生成和解析,这些都是non-internet,也就是不需要网络就可一完成的。那么当生成了邮件,下一步就是发送了,本文就讲解利用SMTP协议发送邮件。  正如SMTP(Simple Mail Transfer Protocal)名字一样,只能发送简单邮件。上面讲解就是生成的简单邮件,完全可以通过SMTP协议来发送。 二、SMT...

buildroot使用介绍【转】

转自:https://www.cnblogs.com/arnoldlu/p/9553995.html buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可...

Python request SSL证书问题

错误信息如下: 1 requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)   python做爬虫,对于有的网站,需要验证证书...

2020系统综合实践 第7次实践作业 11组

目录 1.在树莓派中安装opencv库 1.1 安装依赖 1.2 下载OpenCV源码 1.3 安装pip 1.4 安装Python虚拟机 1.5 编译OpenCV 1.6 安装OpenCV 2.使用opencv和python控制树莓派的摄像头 3.利用树莓派的摄像头实现人脸识别 facerec_on_raspberry_pi.py face...

python直接打印列表

row = [u'课程', u'语文', u'数学', u'英语']print rowprint str(row).decode('unicode-escape')import jsons=json.dumps(row,ensure_ascii=False)print s output: [u'u8bfeu7a0b', u'u8bedu6587', u'u...