并发跟并行

一、并发和并行

多任务的概念:

1.简单地说,就是操作系统可以同时运行多个任务。

并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现多个任务
"一起"执行(实际上总有一个任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

例子: 就相当于好几个同学,同时提问一个老师,老师只能一个个回答。


并行:指的是任务数小于等于cpu核数,即任务真的一起执行的

例子: 就相当于好几个同学,同时提问。多个老师同时给每个同学解答

总结:真正的并行执行多任务只能在多核cpu上实现,但是由于任务数量远远多于cpu的核心
数量,所以操作系统也会自动把很多任务轮流调度到每个核心上执行

2.同步异步

同步:是指线程在访问某一资源时,获得了资源的返回结果之后才会执行其他操作(先做
某些事,再做某些事)
异步:与同步相对,是指线程再访问某一资源时,无论是否取得返回结果,都进行下一步操作;当有了资源返回结果时
系统会通知线程。

二、线程

1、threading模块介绍
python的Thread模块是比较底层的模块,Python的threading模块是对Thread做了一些包装的
可以更加方便的被使用

创建线程对象:threading.Thread(target=func)
参数target指定线程执行的任务(函数)

Thread类提供了一下方法:

方法: 说明
run() 用以表示线程活动的方法
start() 启动线程活动
join() 设置主线程会等待time秒后再往下执行,time默认为子线程结束,多个子线程
之间设置的值会叠加
isAlive() 返回线程是否活动的
getName() 返回线程名
threading.currentThread():返回当前执行的线程
threading.enumerate():返回正在运行的所有线程(list)。正在运行指线程启动后,结束前,不包括启动
前和终止后的线程
threading.activeCount():返回正在运行的线程数量

例子一:
import threading

# 创建线程
def func1(name):
  print("线程一{}".format(name))

def func2():
  print("线程二")

# 创建两个线程
"""
target 传入的函数名, args 函数的参数,是个元祖
"""
t1 = threading.Thread(target=func1, args=("猫咪",))
t2 = threading.Thread(target=func2)

# 启动线程1
t1.start()
print(threading.current_thread())
t1.join()

# 启动线程2
t2.start()
print(threading.current_thread(),threading.enumerate(),threading.active_count())
t2.join()


例子二:
# 创建线程的第二种写法
import requests
class ThreadRequest(threading.Thread):
# 如果写初始化函数一定要调用父类的__init__函数
def __init__(self, url):
  self.url = url
  super().__init__()

# 重写Thread类里面的run方法
def run(self):
  res = requests.get(self.url)
  print("返回状态码{}".format(res.status_code))

url = "https://123.sogou.com/"

# 创建五个线程
for i in range(5):
  t = ThreadRequest(url)
  t.start()
  t.join()

原文地址:https://www.cnblogs.com/666666pingzi/p/10964555.html