if __name__ == 'main

一个python的文件有两种使用的方法,第一是直接作为序执行,第二是import到其他的python程序中被调用(模块重用)执行

因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,

在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为程序直接执行)才会被执行,而import到其他程序中是不会被执行的

第一种情况:

def func():
print('second')
print('first') print(__name__) # 当运行自身被执行的时候,__name__=__main__
if __name__ == '__main__':
func() #当单独执行该文件时,即python main_test.py,输出结果:
"""
first
__main__
second
"""

if __name__=="__main__": 语句之前和之后的代码都被执行。

第二种情况:

import main_test # 导入main_test文件

if __name__ == '__main__':
print('main_test2') # 当单独执行该文件时,即python mian_test2.py,输出结果
"""
first # main_test模块中的print
main_test # 当main_test被导入时, main_test.py中print(__name__) 输出为导入模块的名称main_test,而不是__main__。
main_test2
"""
second没有被输出?

main_test被导入后,不满足__name__ == '__main__' 所以不会输出second,即main_test中的if __name__=="__main__": 之前的语句被执行,之后的没有被执行

Windows创建多进程

代码一

import multiprocessing
import time
import threading print('main process start1')
def func():
print('subprocess start',time.asctime(time.localtime(time.time())))
time.sleep(3)
print('subprocess end',time.asctime(time.localtime(time.time()))) p = multiprocessing.Process(target=func, name='1号')
p.start() print('main process end', time.asctime(time.localtime(time.time())),multiprocessing.current_process())
if __name__ == '__main__':
pass
# 默认所有进程结束后,程序才结束

执行效果

main process start1
main process end Fri Mar 23 11:04:46 2018 <_MainProcess(MainProcess, started)>

main process start1 相当于导入该模块
windows创造进程相当于导入该文件,由于创建进程在main函数之前,会无限递归导入模块创建进程。
所以在
windows创造进程应放在main函数之后,因为main函数不会执行被导入模块。
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 114, in _main
prepare(preparation_data)
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 225, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path
run_name="__mp_main__")
File "C:\Program Files\Python36\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Program Files\Python36\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Program Files\Python36\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\china\PycharmProjects\rq3\并发\课堂\windows_process.py", line 22, in <module>
p.start()
File "C:\Program Files\Python36\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Program Files\Python36\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
prep_data = spawn.get_preparation_data(process_obj._name)
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
_check_not_importing_main()
File "C:\Program Files\Python36\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
is not going to be frozen to produce an executable.''')
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase. This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:

代码二

import multiprocessing
import time
import threading print('main process start1')
def func():
print('subprocess start',time.asctime(time.localtime(time.time())))
time.sleep(3)
print('subprocess end',time.asctime(time.localtime(time.time()))) if __name__ == '__main__': #把进程创建放在main函数中
p = multiprocessing.Process(target=func, name='1号')
p.start()
print('main process end', time.asctime(time.localtime(time.time())), multiprocessing.current_process())
# 默认所有进程结束后,程序才结束

Windows输出结果

main process start1
main process end Fri Mar 23 11:17:00 2018 <_MainProcess(MainProcess, started)>
main process start1 子进程创建时,导入该模块输出main函数之前语句
subprocess start Fri Mar 23 11:17:00 2018 子进程执行func
subprocess end Fri Mar 23 11:17:03 2018

在Linux上输出结果

main process start1 只输出一个start1
main process end Fri Mar 23 12:29:12 2018 <_MainProcess(MainProcess, started)>
subprocess start Fri Mar 23 12:29:12 2018
subprocess end Fri Mar 23 12:29:15 2018

python编程中的if __name__ == 'main与windows中使用多进程的更多相关文章

  1. python编程中的if __name__ == 'main': 的作用和原理

    在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个pyth ...

  2. 如何理解python中的if __name__=='main'的作用

    一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...

  3. python中的if __name__ == 'main'

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用: 对于编程语言来说,程序都必须要有一个入口,比如java和c#必须要 ...

  4. Python原来这么好学-1.1节: 在windows中安装Python

    这是一本教同学们彻底学通Python的高质量学习教程,认真地学习每一章节的内容,每天只需学好一节,帮助你成为一名卓越的Python程序员: 本教程面向的是零编程基础的同学,非科班人士,以及有一定编程水 ...

  5. python 换行符的识别问题,Unix 和Windows 中是不一样的

    关于换行符的识别问题,在Unix 和Windows 中是不一样的(分别是n 和rn).默认情况下,Python 会以统一模式处理换行符.这种模式下,在读取文本的时候,Python 可以识别所有的普通换 ...

  6. 关于python中的 if __name__ == 'main'

    name 是内置变量,它表示的是当前所在模块的名字,同时还能反应一个包的结构. a ├── b │   ├── c.py │   └── __init__.py └── __init__.py 目录中 ...

  7. java中public static void main(String[] args)中String[] args代表什么意思?

    这是java程序的入口地址,java虚拟机运行程序的时候首先找的就是main方法.跟C语言里面的main()函数的作用是一样的.只有有main()方法的java程序才能够被java虚拟机欲行,可理解为 ...

  8. if __name__ == 'main': 的作用和原理

    if __name__ == 'main': 功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行. if __na ...

  9. Python编程-多道技术和进程

    一.多道技术 1.多路复用 操作系统主要使用来 记录哪个程序使用什么资源 对资源请求进行分配 为不同的程序和用户调解互相冲突的资源请求. 我们可将上述操作系统的功能总结为: 处理来自多个程序发起的多个 ...

随机推荐

  1. postman中 form-data、x-www-form-urlencoded、raw、binary的区别

    1.form-data:  就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...

  2. Linux CentOS安装配置MySQL数据库

    没什么好说的,直接正面刚吧. 安装mysql数据库 a)下载mysql源安装包:wget http://dev.mysql.com/get/mysql57-community-release-el7- ...

  3. 20 个 CSS 高级技巧汇总

    原文:https://segmentfault.com/a/1190000003936841 使用技巧会让人变的越来越懒,没错,我就是想让你变懒.下面是我收集的CSS高级技巧,希望你懒出境界. 1. ...

  4. win10系统搭建虚拟机:VMware Workstation Player 12环境+Ubuntu Kylin 16.04 LTS系统

    笔者小白一枚,其实连虚拟机是个啥都不知道...实属惭愧,介于此所以今天倒腾了一下花了一上午就已经搭建好一个VMware Workstation Player 12免费版的,很哈皮,于是赶紧分享一下. ...

  5. json_encode处理json数据中文乱码

    今天使用json_encode 把一个数组转换成json数据,echo处理的时候,显示为null.去查了php手册. 该函数只能接受 UTF-8 编码的数据. 在网上搜了下,找到了解决方法. < ...

  6. 对于vxworks下硬盘驱动

    1.曾经看到帖子说vxworks5.5下没有sata驱动,vxworks6.6下有,这样的说法恐怕不正确,由 于俺在5.5下也运用运用了sata硬盘,请注重这里俺只是说运用运用,没有说运用运用了sat ...

  7. R语言 文本挖掘 tm包 使用

    #清除内存空间 rm(list=ls()) #导入tm包 library(tm) library(SnowballC) #查看tm包的文档 #vignette("tm") ##1. ...

  8. Procedure execution failed 2013 - Lost connection to MySQL server during query

    1 错误描述 Procedure execution failed 2013 - Lost connection to MySQL server during query 2 错误原因 由错误描述可知 ...

  9. freemarker获取封装类中对象的属性

    freemarker获取封装类中对象的属性 1.设计思路 (1)封装学生类 (2)创建数据模型 (3)新建student.ftl (4)运行Junit测试文件,生成HTML文件 2.封装学生类 Stu ...

  10. devDependencies和dependencies的版本写法

    devDependencies和dependencies的版本写法 指定版本:比如1.2.2,遵循大版本.次要版本.小版本的格式规定,安装时只安装指定版本. 波浪号(tilde)+指定版本:比如~1. ...