学习笔记--进程和线程

进程

本质上是一段程序的运行过程(抽象的概念)
定义:就是一个程序在数据集上的一次动态执行过程。

由:程序,数据集和进程控制块组成。程序计数器来保存状态。

单个cpu是并发,不是并行,进程之间是来回切换;如果有多个cpu,会有并行,一个cpu跑一个程序;如果2个cpu跑四个程序,肯定是一个cpu跑一个,剩下2个是时间片切换。

线程

两个进程占两个独立的内存空间,彼此相互独立;

线程的出现是为了降低上下文的消耗,共享整个线程的资源;

一个程序至少有一个进程,一个进程至少有一个线程(进程可以理解成线程的容器)

进程在执行过程中有独立的内存单元,多个线程共享这个进程的内存,从而极大提高运行效率。线程不能独立存在。

线程在执行过程与进程有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

所以:

线程是最小的执行单元;进程是最小的资源单位。

进程是具有一定独立功能的程序关于某个数据集合的一次运行活动,进程是系统进行资源分配和调度的独立单位。

扫描二维码关注公众号,回复: 1245504 查看本文章

线程是cpu调度和分配的基本单位。只拥有一点资源(程序计数器)

同一个进程中的多个线程可以并发执行。

线程的调用以及join方法

python无法用多核。。

如何开多线程
import threading #线程的意思
import time


def Hi(num):
    print('Hello {}'.format(num))
    time.sleep(3)


if __name__ == '__main__':
    """
    创建了2个子线程对象,t1,t1是这个对象的实例。
    target后面接这个线程跑哪个程序
    args是这个程序传入的参数,参数是iterable
    三个线程并发进行
    """
    t1 = threading.Thread(target=Hi, args=(10,))   #Theread是一个类,实例化 子线程1
    t1.start()
    t2 = threading.Thread(target=Hi, args=(9,))  #子线程2
    t2.start()

    print("ending")  #主线程,打完后主线程结束,但是子线程还要停个3秒钟,才出现Process finished with exit code 0

import threading
import time

def music():
    print("begin to listen {}".format(time.ctime()))
    time.sleep(3)
    print("stop to listen {}".format(time.ctime()))

def game():
    print("begin to game {}".format(time.ctime()))
    time.sleep(5)
    print("stop to game {}".format(time.ctime()))


if __name__ == '__main__':

    t1 = threading.Thread(target=music)  #没参数就不用填写args
    t1.start()

    t2 = threading.Thread(target=game)  # 没参数就不用填写args
    t2.start()

    t1.join()
    t2.join()

    print("ending")

    t1 = threading.Thread(target=music)  #没参数就不用填写args


    t2 = threading.Thread(target=game)  # 没参数就不用填写args
    t2.start()

    #t1运行完后,才运行t2,t1和t2不是同时运行,一共用了8秒
    t1.start()
    t1.join()
    t2.start()
    t2.join()

    print("ending")

setDeamon方法,守护线程,线程和主线程一起退出,不管子线程是否运行完。join方法,主线程等待子线程。

join和setDeamnon都是thread实例对象的方法。

threading.Thread还有run(),start(),insAlive(),getName(),setName()。

threading的其他方法:

threading.active_count() 计算几个线程在活动(包括主线程)

while threading.active_count() == 1:
    print()
#等子线程都做完才运行主线程print
调用方式二:继承的方式
class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num = num

    def run(self):  #定义每个线程要运行的函数,一定要是run
        print("")
        time.sleep(3)        

猜你喜欢

转载自blog.csdn.net/gaoyishu91/article/details/80153927