python多线程使用:让你的程序快人一步

一、进程与线程基本概念

  • 计算机的核心是CPU,他承担了所有的计算任务,就像是一座工厂,时刻在运行。
  • 假设工厂的电力有限,一次只能给一个车间供电,也就是说,一个车间开工的时候,其他车间都必须停工,背后的含义就是,单个CPU一次只能运行一个任务。
  • 进程就好比工厂中的车间,代表CPU能处理的单个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
  • 一个车间里,可以有很多工人,他们协同完成一个任务,这些工人就是线程,一个进程包含多个线程。
  • 车间里的空间是工人共享的,也就是说一个进程的内存空间被自己的多个线程共享。
  • 但是一个车间的资源有限,某些资源只能工一个人使用,比如一个厕所,这代表一个线程使用某些共享内存时,其他线程必须等他结束,才能使用这块区域。
  • 一个防止别人打扰你上厕所的方法就是给门上加个锁,后面的人看到锁就在外面等待。这就叫做互斥锁,防止多个线程共同读写某个内存区域。

OS的基本概念。不是这里的重点哈

二、进程与线程的基本实现

1:基本的单线程程序

import time

#工作内容
def work(n):
    print(f"给{n}打销售电话") #f实现字符串拼接
    time.sleep(3)
    print(f"销售电话结束:{n}")
    return

userList = {"yfZhang", "sss", 'xxx'}

#启动了一个进程,进程中有一个主线程
for item in userList:
    work(item)

2:简单的多进程程序

引包from multiprocessing import Process

from multiprocessing import Process
import time

#工作内容
def work(n):
    print(f"给{n}打销售电话") #f实现字符串拼接
    time.sleep(3)
    print(f"销售电话结束:{n}")
    return

userList = {"yfZhang", "sss", 'xxx'}
#多进程,类似于创建多个部门来完成这个工作
if __name__ == '__main__':
    #多进程方式
    pList = []
    for item in userList:
        #循环创建进程
        #第一个元素是要做的工作,第二个参数参数要求是一个元组
        p = Process(target = work, args = (item,))
        #生成进程
        p.start()
        #把创建的进程加入到列表中
        pList.append(p)

    # 阻塞终止进程的执行
    [i.join() for i in pList]

注意多进程需要在main函数中运行,不然会报错RuntimeError: An attempt has been made to start a new process

3:基本的多线程程序

引包from threading import Thread

from threading import Thread
import time

#工作内容
def work(n):
    print(f"给{n}打销售电话") #f实现字符串拼接
    time.sleep(3)
    print(f"销售电话结束:{n}")
    return

userList = {"yfZhang", "sss", 'xxx'}

#多线程,类似于给部门增加人手
if __name__ == '__main__':
    #多进程方式
    pList = []
    for item in userList:
        #循环创建进程
        #第一个元素是要做的工作,第二个参数参数要求是一个元组
        p = Thread(target = work, args = (item,))
        #生成线程
        p.start()
        #把创建的线程加入到列表中
        pList.append(p)

    # 阻塞终止线程的执行
    [i.join() for i in pList]
    

4:进程池与线程池

所谓线程池和进程池,其实就是在工作时固定线程或者进程的数目,防止因为工作很而创建大量的进程和线程。我们分派任务的时候,当某个进程结束后,它会自动的接手目前还没有匹配线程/进程的任务继续执行。

from concurrent.futures import ThreadPoolExecutor
import time

#工作内容
def work(n):
    print(f"给{n}打销售电话") #f实现字符串拼接
    time.sleep(3)
    print(f"销售电话结束:{n}")
    return

userList = {"yfZhang", "syLi", 'xmL', 'python'}

# 1:创建线程池 确定最大的线程数目
pool = ThreadPoolExecutor(max_workers = 3)

# 2:循环指派任务和参数
[ pool.submit(work,user) for user in userList]

# 3:关闭线程池
pool.shutdown()
发布了211 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105322514