博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 3.x 学习笔记15(多线程)
阅读量:5290 次
发布时间:2019-06-14

本文共 2327 字,大约阅读时间需要 7 分钟。

1.线程进程

进程:程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程,不具备执行感念,只是程序各种资源集合

线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

2.线程与进程的区别

线程共享内存空间,                                                                                               进程的内存是独立的

线程共享创建它的进程的地址空间;                                                                        进程拥有自己的地址空间。

线程可以直接访问其进程的数据段;                                                                        进程拥有父进程的数据段的自己的副本。

线程可以直接与其进程的其他线程通信;                                                                 进程必须使用进程间通信与兄弟进程进行通信。

新线程很容易创建;                                                                                                  新流程需要重复父流程。

线程可以对同一进程的线程进行相当程度的控制;                                                   进程只能对子进程进行控制。

对主线程的更改(取消,优先级更改等)可能会影响进程其他线程的行为;            对父进程的更改不会影响子进程。

 

3.一条进程至少有一条线程

4.线程锁
    每个线程在要修改公共数据时,为了避免自己在还没改完的时候别人也来修改此数据,可以给这个数据加一把锁, 这样其它线程想修改此数据时就必须等待你修改完毕并把锁释放掉后才能再访问此数据

 

5.Semaphore(信号量)

    互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。

 

6.join的作用是 等待线程执行完毕

 

7.练习

信号量

__author__ = "Narwhale"import threading,timedef run(n):    semaphore.acquire()    time.sleep(1)    print('线程%s在跑!'%n)    semaphore.release()if __name__ == '__main__':    semaphore = threading.BoundedSemaphore(5)      #最多5个线程同时跑    for i in range(20):        t = threading.Thread(target=run,args=(i,))        t.start()while threading.active_count() !=1:    passelse:    print('所有线程跑完了!')

生产者消费者模型

__author__ = "Narwhale"import queue,time,threadingq = queue.Queue(10)def producer(name):    count = 0    while True:        print('%s生产了包子%s'%(name,count))        q.put('包子%s'%count)        count += 1        time.sleep(1)def consumer(name):    while True:        print('%s取走了%s,并且吃了它。。。。。'%(name,q.get()))        time.sleep(1)A1 = threading.Thread(target=producer,args=('A1',))A1.start()B1 = threading.Thread(target=consumer,args=('B1',))B1.start()B2 = threading.Thread(target=consumer,args=('B2',))B2.start()

红绿灯

__author__ = "Narwhale"import threading,timeevent = threading.Event()def light():    event.set()    count = 0    while True:        if count >5 and count < 10:            event.clear()            print('\033[41;1m红灯亮了\033[0m' )        elif count > 10:            event.set()            count = 0        else:            print('\033[42;1m绿灯亮了\033[0m')        time.sleep(1)        count +=1def car(n):    while True:        if event.isSet():            print('\033[34;1m%s车正在跑!\033[0m'%n)            time.sleep(1)        else:            print('车停下来了')            event.wait()light = threading.Thread(target=light,args=( ))light.start()car1 = threading.Thread(target=car,args=('Tesla',))car1.start()

 

转载于:https://www.cnblogs.com/hsj-jingyu/p/8470856.html

你可能感兴趣的文章
简单几行js实现tab选项切换效果
查看>>
关于更改滚动条样式
查看>>
【数据结构】栈结构操作示例
查看>>
中建项目环境迁移说明
查看>>
三.野指针和free
查看>>
VIO的Bundle Adjustment推导
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
asp.net FileUpload控件文件格式的判断及文件大小限制
查看>>
angular(1.5.8)
查看>>
h5的video标签支持的视频格式
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
学android:直接用jdk来helloworld
查看>>
Access Jira RESTful API by cURL
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
Spark基础脚本入门实践3:Pair RDD开发
查看>>
HDU4405--Aeroplane chess(概率dp)
查看>>
RIA Test:try catch 对 Error #1009 (无法访问空对象引用的属性或方法)的处理
查看>>
python使用easyinstall安装xlrd、xlwt、pandas等功能模块的方法
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>