多线程:
通俗解释:计算机处理一大堆数据。计算机太懒了,觉得一个人处理这么多要花费很多时间。于是找了很多人都一块来处理。那么多人来处理这整个数据就叫多线程。我们可以简单理解为一条生产线上的所有工人。
特点
- 运行在一个CPU上
- 方便高效的线程之间内存共享,通信
- 线程之间切换开销比进程之间较小
- 本质上,计算机在同一时间还是处理了同一个事
Python简单代码实现
import threading # python多进程的包
def thread_job(a):
global lock # 将线程锁引入
lock.acquire() # 开启线程锁
print('This is an added Thread, number is %s' % threading.current_thread()) # 打印当前线程
print(a)
lock.release() # 释放线程锁
def main():
# 激活了多少线程
print(threading.active_count())
# 是哪些线程
print(threading.enumerate())
# 当前线程
print(threading.current_thread())
# 添加thread
a = 1
added_thread = threading.Thread(target=thread_job, args=(a,) name='T1') # args 为传入的参数,必须为tuple类型。name为名字,可以自己定义
# 执行thread
added_thread.start()
# 将此线程加到主线程上。表现的结果为主线程会是最后一个结束,不加的话在执行added_thread的job时,如果时间过长,表现为主线程先结束。
added_thread.join()
lock = threading.Lock() # 线程锁。意义在于如果有两个任务,第二个线程需要第一个线程返回的数据。则把第一个锁住。确保第一个执行了第二个词再执行。
main()
多进程:
通俗解释:多进程就是拥有不同的生产线的工厂。
特点
- 一个CPU上只能运行一个进程,通常我们所说的电脑配置几核就是最大可以创建的进程(注意这里同时运行,因为电脑会切换进程,所以看起来电脑会同时运行的进程数会超过核数)
- 数据共享比较难
- 各个进程之间基本无影响,更稳定和安全,不因线程崩溃而整个系统崩溃
- 多进程的代码不易移植到其他机器上跑 因为系统相关性太强
Python简单代码实现
import multiprocessing as mp
def job(a, d):
print('aaaaa')
# 与多线程很相似
p1 = mp.Process(target=job, args=(1,2), name='P1')
p1.start()
p1.join()
--------------------------------------------------------------------------
# 进程池
def job(x):
return x*x
def multicore():
pool = mp.Pool(processes=4) # 分配几个核
res = pool.map(job, range(10)) # map 表示可迭代的参数
print(res)
res = pool.apply_async(job, (2,)) # apply_async 表示只能是一个参数,不可迭代
print(res.get())
# 强行改成迭代的方法
multi_res = [pool.apply_async(job, (i,)) for i in range(10)]
print([re.get() for re in multi_res])
--------------------------------------------------------------------------
# 共享内存
value = mp.Value('d', 1)
array = mp.Array('i', [1,3,4]) # 不可是多维的
# 共享内存和进程锁
def job(v, num, l):
l.acquire() # 加上进程锁
for _ in range(10):
time.sleep(0.1)
v.value += num
print(v.value)
l.release() # 释放线程锁
# 这个方法可以实现累加,不会出现断断续续的加
def multicore():
l = mp.Lock()
v = mp.Value('i', 0) # 共享了个i类型的数据0,i可以查表知道什么类型
p1 = mp.Process(target=job,args=(v,