并行编程——多线程

代码格式化的快捷键Ctrl + Alt + L
代码格式化的命令code -> Reformat Code
一、概述
(一)非并发
1、程序由单个步骤序列构成
2、包含独立子任务的程序执行性能低
(二)并发
1、异发、高效
2、分解子任务、简化流程与逻辑
(三)进程 process
1、一个程序的执行实例
2、每个进程有自己的地址空间、内存、数据栈及辅助数据
(四)线程 thread
1、同一进程内,可被并行激活的控制流
2、共享相同上下文(空间地址、数据结构)
3、特点
(1)便于信息共享和通信
(2)线程访问顺序差异会导致结果不一致(条件 race condition)
(五)Python GIL 全局解释器锁
1、Glogal Interpreter Lock
2、Python 代码由虚拟机(解释器主循环)控制
3、主循环同时只能有一个控制线程执行
二、多线程
(一)_thread 加下划线表示python已经不建议我们使用这个模块了
1、特点
(1)没有控制进程结束机制
(2)只有一个同步原语(锁)
(3)功能少于theading模块
2、 .start_new_thread(function,args,**kwargs=None)开始线程
args参数要以元组的方式来写
单线程示例:
import time
def worker(n):
print(‘函数执行开始于:{}’.format(time.ctime()))
time.sleep(n)
print(f’函数执行结束于:{time.ctime()}’)

def main():
print(f’【主函数执行开始于:{time.ctime()}】’)
worker(4)
worker(2)
print(f’【主函数执行结束于:{time.ctime()}】’)

if name == ‘main’:
main()

多线程_thread 示例:
import time
import _thread
def worker(n):
print(‘函数执行开始于:{}’.format(time.ctime()))
time.sleep(n)
print(f’函数执行结束于:{time.ctime()}’)

def main():
print(f’【主函数执行开始于:{time.ctime()}】’)
_thread.start_new_thread(worker,(4,))
_thread.start_new_thread(worker,(2,))

time.sleep(4)
print(f'【主函数执行结束于:{time.ctime()}】')

if name == ‘main’:
main()

(二)threading模块
1、 .Thread线程类
(1)构造
.Thread(target=目标函数,args=(参数,))
或者:
自定义Thread派生类,重写run方法逻辑
(2)启动线程
.start()
(3)要求主线程等待
.join()
(4)线程名称
.name

应用:
import time
import threading

def worker(n):
print(‘函数执行开始于:{}’.format(time.ctime()))
time.sleep(n)
print(f’函数执行结束于:{time.ctime()}’)

def testThread():
print(f’【主函数执行开始于:{time.ctime()}】’)

threads = []
t1 = threading.Thread(target=worker, args=(4,))
threads.append(t1)

t2 = threading.Thread(target=worker, args=(2,))
threads.append(t2)

for t in threads:
    t.start()

for t in threads:
    t.join()
    
print(f'【主函数执行结束于:{time.ctime()}】')

if name == ‘main’:
testThread()
2、 .current_thread() 获取当前线程
例如:
import time
import threading

def worker(n):
print(’{}函数执行开始于:{}’.format(threading.current_thread().name,time.ctime()))
time.sleep(n)
print(f’{threading.current_thread().name}函数执行结束于:{time.ctime()}’)

def testThread():
print(f’【主函数执行开始于:{time.ctime()}】’)

threads = []
t1 = threading.Thread(target=worker, args=(4,))
threads.append(t1)

t2 = threading.Thread(target=worker, args=(2,))
threads.append(t2)

for t in threads:
    t.start()

for t in threads:
    t.join()
print(f'【主函数执行结束于:{time.ctime()}】')

if name == ‘main’:
testThread()

派生类的应用:
import time
import threading

def worker(n):
print(’{}函数执行开始于:{}’.format(threading.current_thread().name,time.ctime()))
time.sleep(n)
print(f’{threading.current_thread().name}函数执行结束于:{time.ctime()}’)

class MyThread(threading.Thread):
def init(self,func,args):
threading.Thread.init(self)
self.func = func
self.args = args
def run(self):
self.func(*self.args)

def testThread():
print(f’【主函数执行开始于:{time.ctime()}】’)

threads = []
t1 = myThread(worker,(4,))
threads.append(t1)

t2 = myThread(worker, (2,))
threads.append(t2)

for t in threads:
    t.start()

for t in threads:
    t.join()

print(f'【主函数执行结束于:{time.ctime()}】')

if name == ‘main’:
testThread()
3、同步原语:锁 threading.Lock
(1).acquire() 获得
(2).release() 释放
(3)支持上下文操作 with lock:
例如:
import threading
import time
import random
eggs = []
lock = threading.Lock()
def put_egg(n,lst):
# lock.acquire() #锁上
with lock:
for i in range(1,n+1):
time.sleep(random.randint(0,2))
lst.append(i)
# lock.release() #解锁

def major():
threads = []

for i in range(3):
    t = threading.Thread(target=put_egg,args=(5,eggs))
    threads.append(t)

for t in threads:
    t.start()

for t in threads:
    t.join()

print(eggs)

if name ==‘main’:
major()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值