Python 多线程和多进程

本文详细介绍了在Python中使用`threading`和`multiprocessing`模块创建多线程和多进程的方法,包括直接创建线程、继承Thread类创建线程以及多进程的两种创建方式。同时讨论了线程和进程的概念、join方法的应用以及注意事项,帮助读者理解并发编程的基本原理。
摘要由CSDN通过智能技术生成

^ 多线程和多进程

多线程:from threading import Thread

多进程:from multiprocessing import Process

-第一种创建多线程方法 直接创建线程

T = threading.Thread(target=work, args=(“server_one”, )) # 创建线程对象

target:让线程执行什么任务.

args:线程启动之后,target执行时需要传递的参数. # 参数类型为 tuple (元组).

T.start()

T.join()

import threading
import time
import random
from threading import Thread


def work(server):

    begin = time.time()

    print("检查", server)
    use = random.randint(1, 3)
    time.sleep(use)
    print("关闭", server)

    end = time.time()

    print("本次用时大约:{:.5f}秒".format(end - begin))


if __name__ == "__main__":	# 主线程
    t1 = Thread(target=work, args=("server_one", ))		# 子线程
    t2 = Thread(target=work, args=("server_two", ))		# 子线程
    t3 = Thread(target=work, args=("server_three", ))
    t1.start()	# 告诉CPU,该线程可以启动.
    t2.start()
    t3.start()

-概念

进程是资源分配的最小单位,线程是CPU调度的最小单位

线程:一个进程会有多个线程,至少拥有一个线程.

进程:正在进行中的程序. # 资源单位,不是执行单位.

线程:员工

进程:公司

每次运行程序都会至少产生一个单独的进程,该进程中会有一个主线程存在.

-第二种创建线程方法 继承Thread类

并在自己的类中,重写run方法.

import time
import random

from threading import Thread  # 线程


# 继承Thread类,并在自己的类中,重写run方法.
class MyThread(Thread):

    def __init__(self, server):
        self.server = server
        super(MyThread, self).__init__()    # 子类如果重写父类中的__init__(), 必须调用父类的__init__().

    # run():线程启动之后需要执行的任务.
    def run(self) -> None:  # 表示返回值类型应该是None.	需使用__init__()进行传参.
        print("开始测试:", self.server)
        time.sleep(random.randint(1, 5))
        print("结束测试:", self.server)


# if __name__ == "__main__":
#     b1 = MyThread("server_one")
#     b2 = MyThread("server_two")
#     b3 = MyThread("server_three")
#     # 启动线程使用start().
#     b1.start()
#     b2.start()
#     b3.start()
    
    
    
if __name__ == "__main__":
    for count in range(1, 101):
        variable = "server" + str(count)
        begin = MyThread(variable)
        begin.start()

-join()

需要等待子线程结束后,才会继续执行主线程.

等待过程中,其他线程也在运行.

if __name__ == "__main__":
    b1 = MyThread("server_one")
    b2 = MyThread("server_two")
    
    # 启动线程使用start().
    b1.start()
    b2.start()

    b1.join()
    b2.join()

    print("service")

-注意

不要让多线程变成单线程了

if __name__ == "__main__":
    Thread_list = []
    for count in range(1, 101):
        variable = "server" + str(count)
        begin = MyThread(variable)
        Thread_list.append(begin)

    print(Thread_list)

    for server_begin in Thread_list:
        server_begin.start()

    for server_end in Thread_list[::-1]:
        server_end.join()
        
    print("service")

-创建多进程

创建使用方法类似多线程

– 第一种(最常用)

from multiprocessing import Process


def work():

    for number in range(10000):
        print("子进程", number)


if __name__ == "__main__":

    p = Process(target=work)
    p.start()

    for n in range(10000):
        print("主进程", n)

– 第二种(几乎不用)

from multiprocessing import Process


class MyProcess(Process):

    def run(self) -> None:
        for digit in range(10000):
            print("子进程", digit)


if __name__ == '__main__':

    p = MyProcess()
    p.start()

    for number in range(10000):
        print("主进程", number)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值