Python并发编程 04 进程与线程基础

一、操作系统简介

①操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间。它可以向上给程序员提供管理硬件的接口,方便编写应用程序。
②操作系统内核是一个管理和控制程序,负责管理计算机所有物理资源,其中包括:文件系统、内存管理、设备管理和进程管理。

二、进程

①进程是一个程序在一个数据集上的一次动态执行过程。
②进程一般由程序、数据集、进程控制块三部分组成。
③进程控制块是用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程。它是系统感知进程存在的唯一标识。

三、线程

①进程是最小的资源单位。线程是最小执行单元。进程是线程的容器,线程是进程的一个实体。
②一个运行的程序至少有一个进程,一个进程至少有一个线程。
③进程在执行过程中拥有独立的内存单元,而多个线程共享其内存。
④线程在执行中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序出口。但是线程不能独立于进程存在。
⑤一个线程可以创建和撤销另一个线程。
⑥同一个进程中的多个线程之间可以并发执行。

四、线程的调用

1、示例

import threading
import time

def Hi(num):
    print("hello %d\n" %num,end='')
    time.sleep(3)

if __name__ == "__main__":
    t1 = threading.Thread(target=Hi, args=(10,)) # 主线程创建了一个子线程对象
    t1.start()  # 子线程t1运行函数H1

    t2 = threading.Thread(target=Hi, args=(9,)) # 主线程创建了一个子线程对象
    t2.start()  # 子线程t2运行函数H1

    print("ending",end='')

**上述代码分析:**主线程按照顺序从上到下顺序执行,主线程开设子线程后,与子线程并发运行。所以上述代码会先输出:
  hello 10
  hello 9
  ending
 然后等待三秒,程序运行结束。

2、join方法

join方法:在子进程完成运行之前,这个子进程的父进程一直被阻塞。

import threading
import time

def music():
    print("begin to listen %s\n" %time.strftime("%X"),end="")
    time.sleep(3)
    print("stop to listen %s\n" %time.strftime("%X"),end="")

def game():
    print("begin to game %s\n" %time.strftime("%X"),end="")
    time.sleep(6)
    print("stop to game %s\n" %time.strftime("%X"),end="")

if __name__ == "__main__":
    t1 = threading.Thread(target=music) # 主线程创建了一个子线程对象
    t1.start()  # 子线程t1运行函数H1

    t2 = threading.Thread(target=game) # 主线程创建了一个子线程对象
    t2.start()  # 子线程t2运行函数H1
    t1.join()   # 阻塞主线程,主线程会等待t1线程执行完毕后再继续往下执行

    print("ending %s\n" %time.strftime("%X"),end='')
    
'''
begin to listen 15:04:40
begin to game 15:04:40
stop to listen 15:04:43
ending 15:04:43
stop to game 15:04:46
'''
import threading
import time


def music():
    print("begin to listen %s\n"%time.strftime("%X"),end="")
    time.sleep(5)
    print("stop to listen %s\n" % time.strftime("%X"),end="")


def game():
    time.sleep(1)
    t3=threading.Thread(target=music)
    t3.start()

    print("begin to play game %s\n"%time.strftime("%X"),end="")
    time.sleep(3)
    print("stop to play game %s\n" % time.strftime("%X"),end="")


if __name__ == '__main__':

    t1=  threading.Thread(target=music)

    t2 = threading.Thread(target=game)
    t1.start()
    t2.start()

    t1.join()
    t2.join()

    print("ending %s\n" %time.strftime("%X"),end="")

'''
begin to listen 15:29:44
begin to listen 15:29:45
begin to play game 15:29:45
stop to play game 15:29:48
stop to listen 15:29:49
ending 15:29:49
stop to listen 15:29:50
'''
import threading
import time


def music():
    print("begin to listen %s\n"%time.strftime("%X"),end="")
    time.sleep(5)
    print("stop to listen %s\n" % time.strftime("%X"),end="")


def game():
    time.sleep(1)
    t3=threading.Thread(target=music)
    t3.start()
    t3.join()

    print("begin to play game %s\n"%time.strftime("%X"),end="")
    time.sleep(3)
    print("stop to play game %s\n" % time.strftime("%X"),end="")


if __name__ == '__main__':

    t1=  threading.Thread(target=music)

    t2 = threading.Thread(target=game)
    t1.start()
    t2.start()

    t1.join()

    print("ending %s\n" %time.strftime("%X"),end="")

'''
begin to listen 15:35:54
begin to listen 15:35:55
stop to listen 15:35:59
ending 15:35:59
stop to listen 15:36:00
begin to play game 15:36:00
stop to play game 15:36:03
'''

3、setDaemon方法

setDaemon方法:将线程声明为守护线程,必须在start()方法调用之前设置,将子线程设置为守护线程后,主线程只要完成了,子线程就会和主线程一起退出。该方法基本与join方法是相反的。

import threading
from time import ctime,sleep
import time

def ListenMusic(name):
    print("Beign listening to %s %s\n" %(name,time.strftime("%X")), end="")
    sleep(3)
    print("end listening %s\n" %time.strftime("%X"), end="")

def RecordBlog(title):
    print("Begin recording the %s %s\n" %(title,time.strftime("%X")),end="")
    sleep(5)
    print("end recording %s\n" %time.strftime("%X"), end="")

threads = []

t1 = threading.Thread(target=ListenMusic, args=("水手",))
t2 = threading.Thread(target=RecordBlog, args=("python线程",))

threads.append(t1)
threads.append(t2)

if __name__ == "__main__":
    t1.setDaemon(True)

    for t in threads:
        t.start()

    print("all over %s\n" %time.strftime("%X"), end="")


'''
Beign listening to 水手 01:22:27
Begin recording the python线程 01:22:27
all over 01:22:27
end listening 01:22:30
end recording 01:22:32
'''
import threading
from time import ctime,sleep
import time

def ListenMusic(name):
    print("Beign listening to %s %s\n" %(name,time.strftime("%X")), end="")
    sleep(3)
    print("end listening %s\n" %time.strftime("%X"), end="")

def RecordBlog(title):
    print("Begin recording the %s %s\n" %(title,time.strftime("%X")),end="")
    sleep(5)
    print("end recording %s\n" %time.strftime("%X"), end="")

threads = []

t1 = threading.Thread(target=ListenMusic, args=("水手",))
t2 = threading.Thread(target=RecordBlog, args=("python线程",))

threads.append(t1)
threads.append(t2)

if __name__ == "__main__":
    t2.setDaemon(True)

    for t in threads:
        t.start()

    print("all over %s\n" %time.strftime("%X"), end="")


'''
Beign listening to 水手 01:23:23
Begin recording the python线程 01:23:23
all over 01:23:23
end listening 01:23:26
'''

4、继承式调用(不推荐)

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num

    def run(self):  # # run方法是重写的方法,线程对象执行start方法要运行的该函数
        print("running on number:%s, %s\n" % (self.num, time.strftime("%X")), end="")
        time.sleep(3)
        print("结束:%s, %s\n" % (self.num,time.strftime("%X")), end="")


if __name__ == "__main__":
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()
    print("ending %s\n" % time.strftime("%X"), end="")
    
'''
running on number:1, 22:36:46
running on number:2, 22:36:46
ending 22:36:46
结束:2, 22:36:49
结束:1, 22:36:49
'''

5、其他方法

is_alive() 返回线程是否活动的
getName() 返回线程名
setName() 设置线程名

import threading
import time

def test():
    time.sleep(2)

t1 = threading.Thread(target=test)
t1.start()
print(t1.is_alive())    # True
print(t1.getName())     # Thread-1
t1.setName("T1")
print(t1.getName())     # T1

threading模块提供的一些方法
threading.currentThread() 返回当前的线程变量

import threading
import time

def test():
    time.sleep(2)
    print(threading.currentThread())    # <Thread(Thread-1, started 16028)>

t1 = threading.Thread(target=test)
t1.start()
print(threading.currentThread())    # <_MainThread(MainThread, started 14244)>

threading.enumerate() 返回一个包含正在运行的线程的列表

import threading
import time

def test():
    time.sleep(2)

t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t1.start()
t2.start()

print(threading.enumerate())
# [<_MainThread(MainThread, started 26852)>, <Thread(Thread-1, started 24396)>, <Thread(Thread-2, started 15376)>]

threading.active_count() 返回正在运行的线程数量

import threading
import time

def test():
    time.sleep(2)

t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t1.start()
t2.start()

print(threading.active_count()) # 3
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值