多线程和多进程

前言


之前所写的东西都是单进程单线程

cpu制程:单位nm(纳米),光刻机的技术决定了cpu制程的技术,cpu制程决定了cpu的性能

目前的cpu制程为10nm

多核和多进程概念

多核cpu其实就是多个cpu,几核就是几个

多核之间的协作,通过多进程或多线程来进行沟通

单进程:一个正在内存中运行的程序

多进程:多个在内存中运行的同一程序(除开发人员外,用户使用多进程,如多开qq)

多核能够提升整体运算能力

民用消费级更注重单核的性能
民用企业级讲究单核以及多核性能

企业级cpu个例:

E5 32核,单性能弱,一核有难,多核围观
E3

Python线程

线程:系统资源的最小调度单位,线程与线程之间资源共享,一般用于软件实现异步调用(类似一个线程监控另一个线程,等待调用)

Python线程:是一个伪线程,值为了实现异步调用,没有调度单位,有任何需要运算的程序,都建议使用多进程

协程:轻量级的线程,真线程,创建、销毁速度快,占用资源少

多线程案例(单进程)

异步效果(执行多个for循环)

#多线程案例
import time
import threading            #支持多线程的标准库

def thread_01():
    for i in range(10):
        print('我是线程01,我输出%s' % i)
        time.sleep(1)

threading.Thread(target=thread_01,args=()).start()
#创建线程,指定目标为自定义函数,将thread_01变为线程,args用来传参,自定义函数中定义了参数,则args也要写入参数,start为创建线程直接启动
#代码非阻塞


for i in range(10):
    print('我是主线程,我输出%s' %  i)
    time.sleep(1)

#运行之后的输出情况是一组一组进行输出
我是线程01,我输出0
我是主线程,我输出0

我是主线程,我输出1
我是线程01,我输出1

我是线程01,我输出2
我是主线程,我输出2

我是线程01,我输出3
我是主线程,我输出3

我是线程01,我输出4
我是主线程,我输出4

我是线程01,我输出5
我是主线程,我输出5

我是线程01,我输出6
我是主线程,我输出6

我是线程01,我输出7
我是主线程,我输出7

我是线程01,我输出8
我是主线程,我输出8

我是线程01,我输出9
我是主线程,我输出9

传参案例

import time
import threading            

def thread_01(aaa):
    for i in range(10):
        print('我是线程01,我输出%s' % i)
        time.sleep(1)
threading_01(111)
threading.Thread(target=thread_01,args=(111,)).start()
#传参后必须带逗号

多线程多进程案例

多进程之间的数据是不互通的

import time
import multiprocessing   #支持多进程的标准库

def process():
    for i in range(10):
        print('我是子进程,我输出%s' % i)
        time.sleep(1)

if __name__ == "__main__":  #判断当前进程是否是主进程master process
    multiprocessing.Process(target=process, args=()).start()   #拉起一个新进程
    for i in range(10):
        print('主进程:%s' % i)
        time.sleep(1)
#运行后
主进程:0
我是子进程,我输出0
主进程:1
我是子进程,我输出1
主进程:2
我是子进程,我输出2
主进程:3
我是子进程,我输出3
主进程:4
我是子进程,我输出4
主进程:5
我是子进程,我输出5
主进程:6
我是子进程,我输出6
主进程:7
我是子进程,我输出7
主进程:8
我是子进程,我输出8
主进程:9
我是子进程,我输出9

cpu一拖八

import time
import multiprocessing   #支持多进程的标准库

def process():
    for _ in range(100000000):
        1000 + 1000

if __name__ == "__main__":  #判断当前进程是否是主进程master process
    for _ in range(8):               #按照cpu数量循环即可
        multiprocessing.Process(target=process, args=()).start()   #拉起一个新进程
    for _ in range(100000000):
        1000 + 1000

多核运算多核得分

import random
import time
import multiprocessing
#定时器
def profTest():
    start = time.time()
    for _ in range(1000000):
        random.randint(0,1000) + random.randint(0,1000)
        random.randint(0,1000) - random.randint(0,1000)
        random.randint(0,1000) * random.randint(0,1000)
        random.randint(1,1000) / random.randint(1,1000)
    end = time.time()
    grade = 100 - (end - start)   #两个时间的差值就是,运行计算所用时间
    grade = int(grade * 100)
    print("您的计算机多核得分为:%s分!" % grade)
if __name__ == "__main__":
    for _ in range(8):
        multiprocessing.Process(target=profTest, args=()).start()
#运行后
您的计算机多核得分为:8021分!
您的计算机多核得分为:8015分!
您的计算机多核得分为:8028分!
您的计算机多核得分为:8019分!
您的计算机多核得分为:7987分!
您的计算机多核得分为:8000分!
您的计算机多核得分为:8004分!
您的计算机多核得分为:7985分!

多进程之间数据互通

由Queue(进程队列)来完成,由子进程将数据put到队列中,由主进程get

import random
import time
import multiprocessing
#定时器
def profTest(queue):
    start = time.time()
    for _ in range(1000000):
        random.randint(0,1000) + random.randint(0,1000)
        random.randint(0,1000) - random.randint(0,1000)
        random.randint(0,1000) * random.randint(0,1000)
        random.randint(1,1000) / random.randint(1,1000)
    end = time.time()
    grade = 100 - (end - start)   #两个时间的差值就是,运行计算所用时间
    grade = int(grade * 100)
    queue.put(grade)    #将grade传到queue队列中
if __name__ == "__main__":
    #创建队列
    queue = multiprocessing.Queue()
    #创建进程
    for _ in range(8):
        multiprocessing.Process(target=profTest, args=(queue,)).start()
    #等待收集结果
    result = 0

    for _ in range(8):
        result += queue.get()              #将所有结果存放到result中
        #计算分数
    print("cpu多核性能平均分:%s" % (result // 8))
    print('cpu多核性能总分:%s' % result)
#运行后
cpu多核性能平均分:8071
cpu多核性能总分:64575

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0