python中的线程和进程。

1.什么是进程和线程。

1.1 进程的概念

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,每个进程都有自己的地址空间、内存、数据栈及其它记录其运行轨迹的辅助数据

1.2 线程的概念

线程是进程中执行运算的最小单位,是进程中的一个实体是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

1.3 线程和进程的关系。

进程和线程的关系:

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。

  • 处理机分给线程,即真正在处理机上运行的是线程

  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

进程与线程的区别:

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

  • 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

2. Python中多线程的概念

        前面解释了线程和进程分别是什么,并且有哪些区别主要作为概念了解下。

2.1 多线程

        多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行,理论上多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。多个任务可以实现共享资源。

      但是在并发情况下,指令执行的先后顺序由内核决定。同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清除哪一个会先执行。因此要考虑多线程同步的问题。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源。

2.2 python多线程的作用,原理,缺陷

作用:提高程序执行速度

原理:多线程能够提高执行速度的原因是什么?假如一个程序包含多个子任务,这些任务相互独立,没有因果关系。

a.单线程情况下,执行过程中,某个子任务在等待I/O,然而I/O到来的时间不确定,cpu时间耗在毫无意义的等待上,程序执行时     间也将加上这一段等待的时间。

b.多线程情况下,若某个子任务等待I/O,可切换出其他线程执行,等到合适的时机(I/O到达)再切换回该线程,避免了cpu无意义     的等待,也降低了程序的执行时间。

缺陷:由于GIL的存在,python多线程中只能有一个线程会被执行,无论你启多少个线程,你有多少个cpu, Python在执行的时候            会淡定的在同一时刻只允许一个线程运行。(由于切换的速度比较快看起来像并发原理,实际并不是一种并发)。

3.如何开启多线程

3.1如何启用线程

      python多线程模块threading。

3.1.1 定义函数来开启多线程

import threading
import time

def func(name):
    print("hello", name)
    time.sleep(3)

t1 = threading.Thread(target=func,args=("ycw",))
t2 = threading.Thread(target=func,args=("sjy",))

t1.start()      # 并发
t2.start()      # 并发

# func("ycw")    # 先执行
# func("sjy")   # 再执行

3.1.2 定义类方法来开启多线程

#! /usr/bin/env python3
# -*- coding:utf-8 -*-


import threading
import time

# tread类方法调用
class MyTread(threading.Thread):
    def __init__(self,name):
        super(MyTread,self).__init__()
        self.name = name

    def run(self):
        print("hello",self.name)
        time.sleep(3)

t1 = MyTread("ycww")
t2 = MyTread("sjyy")

t1.start()      # 并发
t2.start()      # 并发

以上就是开启多线程的两种方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值