python编程中的if __name__ == 'main与windows中使用多进程

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中使用多进程

原文地址:https://www.cnblogs.com/xiao-apple36/p/8629030.html

时间: 2024-08-25 20:57:10

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

python编程中的if __name__ == &#39;main&#39;: 的作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行.因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本

【转】python编程中的if __name__ == &#39;main&#39;: 的作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行.因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本

分享《Python核心编程(第3版)》《Python编程入门(第3版)》高清中英文版PDF+源代码

<Python核心编程(第3版)>经典<Python核心编程(第二版)>的全新升级版本,总共分为3部分.第1部分为讲解了Python的一些通用应用,包括正则表达式.网络编程.Internet客户端编程.多线程编程.GUI编程.数据库编程.Microsoft Office编程.扩展Python等内容.第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器.CGI和WSGI相关的Web编程.Django Web框架.云计算.高级Web服务.第3部分则为一个补充/实验章节,包括文

if __name__ == &#39;main&#39;: 的作用和原理

if __name__ == 'main': 功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行. if __name__ == 'main': 的作用: 就是控制这两种情况执行代码的过程,在"if __name__ == 'main': "下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的. 原理 每个python模块(python文件,也就是*

if __name__ == &#39;main&#39;:

https://study.163.com/course/courseMain.htm?courseId=1005913008在学习这个视频教程中,看到老师使用了if __name__ == 'main': 代码,所以百度找了下使用原理: 原文链接:http://www.dengfeilong.com/post/60.html python编程中的if __name__ == 'main': 的作用和原理 发布于:2018-03-22  |   作者:admin  |   已聚集:73832人围

Python编程入门与实践pdf电子版下载

Python编程入门与实践pdf电子版下载 分享链接:https://pan.baidu.com/s/1h7TfuuUcaju8nkrMZgv-hg 提取码:7lo8 本书针对想要学习Python却无从下手的同学们准备的,希望好的资源能够给老铁提供有用的帮助 书籍目录 第一部分 基础知识 第1章 起步 1.1 搭建编程环境 1.1.1 Python 2和Python 3 1.1.2 运行Python代码片段 1.1.3 Hello World程序 1.2 在不同操作系统中搭建Python编程环境

Ubuntu下访问Windows中Postgresql

因为项目的原因,需要将Ubuntu中的一些信息记录到Windows中的Postgresql数据库中,查看网上信息,最后成功了,特地记录以下,需要以下步骤: (1)在Windows中Postgresql目录下找到pg_hba.conf文件,并做修改. 在此文件中添加一行,格式参考下面七种: local      database  user  auth-method  [auth-option] host       database  user  CIDR-address  auth-metho

python中的if __name__==&#39;__main__&#39;: main()解析

python中我们会看到一段代码是这样的: 1 if __name__=='__main__': 2 main() 这段代码的什么意思,我们可以知道代码的意思是如果__name__=='__main__'为Ture,则调用main()函数 有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. __name__的值是什么?模块是对象,并且所有的模

python中的if __name__ == &#39;__main__&#39; what hell is it?

python中的if __name__ == '__main__' what hell is it? python认为一切模块都可能被执行或者被import 如果一个模块是被import导入的,那么该模块的调用者可能仅仅希望使用模块的部分代码,而不是直接运行它 如果模块是直接运行的,那么像c或者java语言一样,需要一个入口main 为了解决这个问题,python约定,当模块被执行的时候,__name__的值就是__main__,否则,值为模块的名字 而if __name__ == '__mai