zoukankan      html  css  js  c++  java
  • Python并行编程(一):基本概念

      1、线程和进程

          进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器。线程是一个控制流程,可以在进程内与其他活跃的线程同时执行。控制流程指的是顺序执行一些机器指令。进程可以包含多个线程,所以开启一个浏览器,操作系统将创建一个进程,并开始执行这个进程的主线程。每一个线程将独立执行一系列的指令,通常是一个函数,并且和其他线程并行执行。然而,同一个进程内的线程可以共享一些地址空间和数据结构。线程也被称作轻量进程,因为它和进程有许多共同点,比如都是可以和其他控制流程同时运行的控制流程,不同于进程的是多个线程可以共享很多资源,特别是地址空间和数据结构等。

          - 进程可以包含多个并行运行的线程

          - 操作系统创建和管理线程比进程更节省CPU资源。线程用于一些小任务,进程用于繁重的任务:运行应用程序

          - 同一个进程下的线程共享地址空间和其他资源,进程之间相互独立

    2、在Python中使用进程

          创建called_Process.py

    print("Hello Python Parallel!!")
    closeInput = input("Press ENTER to exit")
    print("Closing calledProcess")

          创建calling_Process.py

    import os
    import sys
    ## this is the code to execute
    program = "python"
    print("Process calling")
    arguments = ["called_Process.py"]
    ## we call the called_Process.py script
    os.execvp(program, (program,) + tuple(arguments))
    print("Good Bye!!")

          此时执行calling_Process会通过execvp开启一个新的进程,替换当前的进程,所以Good Bye不会被打印。

          执行结果如下:

          

          再次敲击回车

          

          程序结束

     3、在Python中使用线程

          基于线程的并行是编写并行程序的标准方法。然而Python解释器并不完全是线程安全的,为了支持多线程的Python程序,CPython使用全局解释器锁的技术,但是这意味着同一时间只有一个线程可以执行Python代码;执行某一个线程一小段时间之后,Python会自动切换到下一个线程。GIL并没有完全解决线程安全的问题,如果多个线程视图使用共享数据,还是可能导致未确定的行为。

          线程例子:

    from threading import Thread
    from time import sleep
    
    class CookBook(Thread):
        def __init__(self):
            Thread.__init__()
            self.message = "Hello Parallel Python CookBook!!
    "
    
        def print_message(self):
            print(self.message)
    
        def run(self):
            print("Thread Starting
    ")
            x = 0
            while (x < 10):
                self.print_message()
                sleep(2)
                x += 1
            print("Thread Ended
    ")
    
    # start the main process
    print("Process Started")
    
    # create a instance
    hello_python = CookBook()
    
    # start hello_python by run
    hello_python.start()
    print("Process Ended")

          启动该脚本输出如下:

          

          主程序执行结束的时候,线程依然会每两秒打印一次信息,证实了线程是在父进程下执行的一个子任务。

          注意:此例子为测试用例,不可在大型程序中留下任何线程在后台默默运行。

  • 相关阅读:
    DateUtil(比较两个日期是否是同一天)
    用过的读写
    小笔记
    日志解析LogParse启动参数配置
    wow经典台词
    Quartz资源收藏
    Quartz Job基本示例
    已知两点坐标,及在从其中一点开始移动的距离,求移动到的坐标
    如何为SUSE配置IP地址,网关和DNS
    详解Linux Initrd
  • 原文地址:https://www.cnblogs.com/dukuan/p/9755576.html
Copyright © 2011-2022 走看看