python 进程和线程

进程和线程的理解:
计算机就像一个汽车厂,当有一个汽车来汽车厂的时候,就相当于我们的计算机打开了一个程序,汽车来到汽车厂之后,汽车厂首先是给这个汽车分配洗车位,如果是一辆小汽车,可能只需要分配一个汽车位,如果是一辆客车,就需要分配两个汽车位。这就好比是我们打开一个程序之后,计算机要给这个程序的进程分配各种系统资源,比如一定的内存。当我们的汽车分配好汽车位之后,就会有一个汽车工开始洗这辆车。汽车就好比计算机里的进程,而这个洗车工就相当于线程。但来汽车厂的汽车,除了洗车之外,有些汽车还需要给汽车检修一下,这样的话这里的检修工又相当于一个线程。每一个程序至少有一个进程,每一进程至少有一个线程。

进程与线程

进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。

线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

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

进程

需要导入的模块

from multiprocessing import Process 

单一进程

import time
from multiprocessing import Process

def test(id):       ##进程要执行的函数
    time.sleep(1)      #进程挂起时间,正常程序不需要     
    print("进程%d结束!"%(id))
    
if __name__ == '__main__':  #主函数
    t1 = time.time()
    p = Process(target=test, args=(1,)) #进程创建,target=要执行的函数,args=参数(以元组形式传递)
    p.start()       #开始进程
    p.join()        #等所以子进程执行完后返回主进程
    t2 = time.time()
    print(t2-t1)

多进程(模拟进程池)

import time 
from multiprocessing import Process     ##模块导入
def test(id):       ##进程要执行的函数
    time.sleep(1)      #进程挂起时间      
    print("进程%d结束!"%(id))
if __name__ == '__main__':
    #freeze_support()
    t1=time.time()
    pool=[]
    for i in range(1,10):       ##要执行的进程的个数
        p=Process(target=test, args=(i,))       ###主进程的创建
        p.start()
        pool.append(p)      ##模拟一个进程池
    for p in pool:      
        p.join()        ##等所有子进程都返回到主进程
    t2=time.time()
    print(t2-t1)

在这里插入图片描述
进程池

from multiprocessing import Pool
import time

def func(id):
    time.sleep(1)
    print(f'进程{id}')

if __name__=="__main__":    
    start=time.time()
    p=Pool(10)      ##进程池
    for i in range(1,11):
        p.apply_async(func,args=(i,)) ##像进程池添加进程
    p.close()   ##关闭进程池
    p.join()     ###统一回到主进程
    end=time.time()
    print(end-start)
    print("OK!")

进程池的最佳执行个数。

线程

单一线程

import time 
from threading import Thread

def test(id):       ##执行函数
    time.sleep(1)            
    print("线程%d结束!"%(id))
if __name__ == '__main__':

    ts=time.time()       
    t=Thread(target=test, args=(1,))    ##线程的创建
    t.start()       ##线程的开始   
    t.join()        ##等所有子线程都都执行完后才回收
    te=time.time()
    print(te-ts)

多线程(模拟线程池)

import time 
from threading import Thread

def test(id):       ##执行函数
    time.sleep(1)            
    print("线程%d结束!"%(id))
if __name__ == '__main__':
    #freeze_support()
    ts=time.time()
    threads=[]      ##模拟线程池
    for i in range(1,10):
        t=Thread(target=test, args=(i,))    ##主线程的创建
        t.start()       ##线程的开始
        threads.append(t)
    for t in threads:
        t.join()        ##等所有子线程都都执行完后才回收
    te=time.time()
    print(te-ts)

线程池

import time
import threadpool  
def sayhello(str):          ##执行函数
    print ("Hello ",str)
    time.sleep(2)

name_list =['xiaozi','aa','bb','cc']
start_time = time.time()
pool = threadpool.ThreadPool(10)        ##线程池中的线程的个数
        ##调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数
        ##其中回调函数可以不写,default是无,也就是说makeRequests只需要2个参数就可以运行;
        
requests = threadpool.makeRequests(sayhello, name_list) 

[pool.putRequest(req) for req in requests] 
""" 
是将所有要运行多线程的请求扔进线程池,[pool.putRequest(req) for req in requests]等同于

  for req in requests:  

     pool.putRequest(req) 
"""
pool.wait() 
print ('%d second'% (time.time()-start_time))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值