一.线程:
创建线程有两种方式(本质是一样的,创建好线程之后,cpu调度创建好的线程时执行的其实是Thread的run()方法):
  1. import threading
  2.  
  3. def f1(args):
    print(args)
    #方式一
    t=threading.Thread(target=f1,args=(123,))
    t.start()
  4.  
  5. #方式二
    class MyThread(threading.Thread):
    def __init__(self,func,args):
    self.func=func
    self.args=args
    super(MyThread,self).__init__()
    def run(self):
    self.func(self.args)
    t1=MyThread(f1,123)
    t1.start()

123

123
 
队列:
  1. import queue
  2.  
  3. q=queue.Queue(2)
    q.put(1)
    q.put(2)
    q.put(3,block=False) #设置不阻塞(block为False),插不进去直接报错
Traceback (most recent call last):
  File "/Users/admin/Desktop/zy/test.py", line 10, in <module>
    q.put(3,block=False)  
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 130, in put
    raise Full
queue.Full
  1. import queue,threading,time
  2.  
  3. def f1(q):
    q.put(123,timeout=3) #超时5s没有插进队列就会抛异常
    q=queue.Queue(2)
    q.put(1)
    q.put(2)
    t=threading.Thread(target=f1,args=(q,)) #子线程插入第三条数据
    t.start() #创建好子线程啦,等待cpu调度
    #情况一:
    time.sleep(1) #主线程等待1s,子线程put超时3秒,先主线程get,后子线程put,put成功
    #情况二:
    time.sleep(5) #主线程等待5s,子线程put超时3秒,主线程没来得及get,子线程就put,会报错
  4.  
  5. q.get()
 
 
  1. import queue
  2.  
  3. q=queue.Queue()
    q.put(1)
    q.put(2)
    print(q.get())
    print(q.get())
    print(q.get(block=False)) #设置不阻塞(block为False),队列里没有数据会报错
1
Traceback (most recent call last):
2
  File "/Users/admin/Desktop/zy/test.py", line 12, in <module>
    print(q.get(block=False))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 161, in get
    raise Empty
queue.Empty
 
  1. import queue,threading,time
  2.  
  3. def f1(q):
    print(q.get(timeout=3))
    q=queue.Queue()
    q.put(1)
    q.put(2)
    print(q.get())
    print(q.get())
    t=threading.Thread(target=f1,args=(q,))
    t.start()
    #情况一:
    time.sleep(1) #主线程等待1s,子线程超时3s,主线程先put,子线程后get,不会报错
    #情况二:
    time.sleep(5) #主线程等待5s,子线程超时3s,子线程先get,主线程再put,子线程get不到数据,直接报错
  4.  
  5. q.put(3)
 
  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import queue
    #队列:先进先出
    q=queue.Queue(10) #队列最大长度,默认是0 无限大
    q.put(11,timeout=5) #放数据,默认阻塞True 阻塞时可以设置超时时间
    q.put(22,block=False) #非阻塞,不等待
    size=q.qsize() #队列长度
    data=q.get(timeout=5) #取数据 默认阻塞True 阻塞时可以设置超时时间
    data=q.get(block=False) #非阻塞,不等待
    bool_num=q.empty() #队列为空返回True
    bool_num=q.full() #队列满了返回True
    q.join() #阻塞进程,当队列中任务执行完毕之后(q.task_done),不再阻塞
    q.task_done()
  1. import queue
    #队列:先进先出
    q=queue.Queue(2) #队列最大长度,默认是0 无限大
  2.  
  3. q.put(11)
    q.task_done()
    q.put(22)
  4.  
  5. q.join()

阻塞进程

  1. import queue
    #队列:先进先出
    q=queue.Queue(2) #队列最大长度,默认是0 无限大
  2.  
  3. q.put(11)
    q.task_done()
    q.put(22) #每执行完一步要执行下q.taskdone()
    q.task_done()
    q.join()

不阻塞

  1. import queue
    #队列:后进先出
    q=queue.LifoQueue(5)
    q.put(123) #优先级相同,先进先出
    q.put(345)
    q.put(456)
  2.  
  3. print(q.get())
    print(q.get())
    print(q.get())

456

345
123
  1. import queue
    #队列:优先级
    q=queue.PriorityQueue(5)
  2.  
  3. q.put((0,123)) #优先级相同,先进先出
    q.put((1,345))
    q.put((0,456))
  4.  
  5. print(q.get())
    print(q.get())
    print(q.get())
(0, 123)
(0, 456)
(1, 345)
  1. import queue
    #队列:双向队列
  2.  
  3. q=queue.deque()
    q.append(123)
    q.append(456)
    q.appendleft(789)
    q.appendleft(890)
    # 980 789 123 456
    print(q.pop())
    print(q.popleft())

456

890
 
生产者消费者模型:功能:1.客户端不阻塞,不持续占用连接,解决瞬时高并发   2.程序解耦合(生产者改变不影响消费者那端)
  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import threading,queue,time
    q=queue.Queue(50)
    def producter(user):
    print("%s来买票啦" % user)
    q.put("%s来买票啦" % user)
    def consumer():
    who=q.get()
    time.sleep(5)
    print(who + "--出票")
  4.  
  5. for i in range():
    user="user" + str(i)
    t=threading.Thread(target=producter,args=(user,))
    t.start()
    while True:
    t1=threading.Thread(target=consumer)
    t1.start()
user0来买票啦
user1来买票啦
user2来买票啦
user3来买票啦
user1来买票啦--出票
user0来买票啦--出票
user2来买票啦--出票
user3来买票啦--出票
 
线程里锁的机制:
应用程序的最小单位是线程,他们共用这个应用程序里的资源,如果同时对某个数据进行修改的话,就会产生脏数据
解决:锁 
  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import threading,queue,time
    q=queue.Queue(5)
    def producter(user):
    print("%s来买票啦" % user)
    q.put("%s来买票啦" % user)
    num=12
    def consumer(lock):
    global num
    lock.acquire() #上锁
    who=q.get()
    num-=1
    time.sleep(2)
    print(who + "--出票","剩余票数:%d" % num)
    lock.release() #开锁
    for i in range(4):
    user="user" + str(i)
    t=threading.Thread(target=producter,args=(user,))
    t.start()
    #lock=threading.Lock()
    lock=threading.RLock() #构建锁对象 Lock只能加一重锁 RLock可以加多重锁
    while True:
    t1=threading.Thread(target=consumer,args=(lock,))
    t1.start()
user0来买票啦
user1来买票啦
user2来买票啦
user3来买票啦
user0来买票啦--出票 剩余票数:11
user1来买票啦--出票 剩余票数:10
user2来买票啦--出票 剩余票数:9
user3来买票啦--出票 剩余票数:8
  1. #lock=threading.Lock()
    #lock=threading.RLock() #构建锁对象 Lock只能加一重锁 RLock可以加多重锁
    lock=threading.BoundedSemaphore(2) #上面两种锁都是每次放行1个线程,这个可放行多个

一次放行2个线程

  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import threading
  4.  
  5. def func(i,event):
    print(i)
    event.wait() #监测是什么灯,红灯停绿灯行
    print(i+100)
  6.  
  7. event=threading.Event() #信号 收到信号就放行所有线程
  8.  
  9. for i in range(4):
    t=threading.Thread(target=func,args=(i,event,))
    t.start()
  10.  
  11. event.clear() #设置成红灯
    inp=input(">>>:")
    if inp == "1":
    event.set() #设置成绿灯
0
1
2
3
>>>:1
100
101
102
103
 

线程池:
  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. import queue,threading,time
    class ThreadPool:
    def __init__(self,maxsize=5):
    self.maxsize=maxsize
    self._q=queue.Queue(maxsize)
    for i in range(maxsize):
    self._q.put(threading.Thread)
    def get_thread(self):
    return self._q.get()
    def add_thread(self):
    self._q.put(threading.Thread)
  4.  
  5. pool=ThreadPool(5)
    def task(args,p):
    print(args)
    time.sleep(2)
    p.add_thread()
    for i in range(10):
    t=pool.get_thread()
    obj = t(target=task,args=(i,pool,))
    obj.start()

3个缺点:

1. 
 
 
 
进程:
共享空间:
  1. #!/usr/bin/env python
    # -*- coding:utf-8 -*-
  2.  
  3. from multiprocessing import Process
    from multiprocessing import queues
    import multiprocessing
    from multiprocessing import Manager
  4.  
  5. def foo(i,args):
    args[i]=i+100
    print(args.values())
    if __name__ == "__main__":
    obj=Manager()
    li=obj.dict()
    for i in range(5):
    p = Process(target=foo,args=(i,li,))
    p.start()
    import time
    time.sleep(2)
[101]
[101, 102]
[101, 102, 103]
[100, 101, 102, 103]
[100, 101, 102, 103, 104]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

python成长之路11的更多相关文章

  1. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  2. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  3. 【Python成长之路】装逼的一行代码:快速共享文件

    [Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...

  4. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  5. 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

    2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...

  6. 我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)

    三.深浅拷贝 在Python中将一个变量的值传递给另外一个变量通常有三种:赋值.浅拷贝以及深拷贝 讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字.字符串.布尔以及None等,还有 ...

  7. 我的Python分析成长之路11

    数据预处理 如何对数据进行预处理,提高数据质量,是数据分析中重要的问题. 1.数据合并 堆叠合并数据,堆叠就是简单地把两个表拼在一起,也被称为轴向链接,绑定或连接.依照轴的方向,数据堆叠可分为横向堆叠 ...

  8. Python成长之路第二篇(1)_数据类型内置函数用法

    数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> a ...

  9. python成长之路七-函数的进阶

    1,python中,名称空间分三种: 全局命名空间 局部命名空间(临时命名空间) 内置名称空间 2,作用域(两种): 1,全局作用域  包含:全局名称空间   内置名称空间 2,局部作用域  包含:局 ...

随机推荐

  1. CCNA实验(10) -- Access List

    使用包过滤技术在路由器上读取三层及四层报头的信息如源地址.目的地址.源端口.目的端口根据预先定义好的规则对包进行过滤 三种类型:1.标准ACL:表号范围1-99或1300-1999.仅对源IP地址进行 ...

  2. Android视频应用去广告学习实践

    注意:本文仅仅供学习研究用途 第一步 素材搜集 腾讯视频应用:http://download.csdn.net/detail/itleaks/7991795      反汇编工具:           ...

  3. ostringstream的使用方法

    ostringstream的使用方法 [本文来自]http://www.builder.com.cn/2003/0304/83250.shtml http://www.cppblog.com/alan ...

  4. 汉诺塔 python版

    汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况. 思路分析:假设前要移动第100个盘子,分两步走,移动第99个:再移动第100个:而要移动第99个 ...

  5. iOS网络开发-打造自己的视频客户端

    一.展示实现 效果      客户端:                                      服务器端:            二.创建表 create table CourseV ...

  6. 如何优雅的代码编写 AutoLayout

    概述 使用 Objective-C 纯代码编写 AutoLayout,看 AutoLayout 的字面理解就是自动布局,听起来好像蛮屌的样子.说白了就是适配:适应.兼容各种不同的情况,包括不同版本的操 ...

  7. Javaweb统计在线人数的小栗子

    最近在学习Javaweb相关的内容(不黑不吹之前对web开发零基础),下面通过一个统计在线人数的小栗子讲讲Servlet监听器吧 开发环境 eclipse  tomcat 7 先说说这个小栗子的构思: ...

  8. quartz 定时调度持久化数据库配置文件

    1 下载quartz对应版本jar包 2 初始化对应数据库sql(版本需要对应,不然会出现少字段的情况) ,下载地址  https://github.com/quartz-scheduler/quar ...

  9. C#中网站根路径、应用根路径、物理路径、绝对路径,虚拟路径的区别

    C#中网站根路径,请站点的最外一层 /表示 应用根路径 ~/表示,有时候C#程序路径并不是网站路径 物理路径 server.mappath("~/") 是指应用程序放在服务器硬盘的 ...

  10. [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度

    在cocos2d-x里面  想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...