多进程多线程

Posted PING1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程多线程相关的知识,希望对你有一定的参考价值。

多进程、多线程

[toc]

线程

线程是==操作系统能够进行运算调度的最小单位(程序执行流的最小单元)==。它被包含在进程之中,是进程中的实际运作单元。一条线程指的是进程中==一个单一顺序的控制流==,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

一个标准的线程有线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。

线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中==一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元==。在单一程序中同时运行多个想成完成不同的工作,称为多线程。

进程

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据机器组织形式的描述,进程是程序的实体。里面包含对各种资源的调用,内存的管理,网络接口的调用等。

线程和进程的区别

  • 线程共享内存空间;进程的内存是独立的
  • 同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现
  • 创建新进程很简单;创建新进程需要对其父进程进行一个克隆
  • 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程
  • 改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程

python GIL(Global Interpreter Lock)

python GIL 称为 python全局解释器锁,表示无论你启动多少个线程,你有多少个cpu,Python在执行的时候都只会在同一时刻只允许一个线程运行。

需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL

因此,这种伪多线程的情况在Cpython解释器中是存在的,但在其他解释器就可能不存在,如Jpython。因此:GIL并不是python的特性,Python完全可以不依赖于GIL
参考

Python实现多进程

import multiprocessing
 5 import time,threading
 6 
 7 def thread_id():
 8     """获得线程ID。"""
 9     print(" thread..")
10     print("thread_id:%s\n" % threading.get_ident())
11 
12 def hello(name):
13     time.sleep(2)
14     print("hello %s..." % name)
15     # 启一个线程
16     t = threading.Thread(target=thread_id,)
17     t.start()
18 
19 if __name__ == "__main__":            # windows环境下必须写这句,不写会报错
20     for i in range(10):
21         # 启一个进程和一个线程的语法都差不多
22         p = multiprocessing.Process(target=hello,args=("progress %s" % i,))
23         p.start()

以上是关于多进程多线程的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程

多线程编程

python多线程

python中的多线程和多进程编程

[Python3] 043 多线程 简介

八.多进程与多线程