多进程多线程
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()
以上是关于多进程多线程的主要内容,如果未能解决你的问题,请参考以下文章