一.线程:
创建线程有两种方式(本质是一样的,创建好线程之后,cpu调度创建好的线程时执行的其实是Thread的run()方法):
import threading

def f1(args):
print(args)
#方式一
t=threading.Thread(target=f1,args=(123,))
t.start() #方式二
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
 
队列:
import queue

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
import queue,threading,time

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,会报错 q.get()
 
 
import queue

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
 
import queue,threading,time

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不到数据,直接报错 q.put(3)
 
#!/usr/bin/env python
# -*- coding:utf-8 -*- 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()
import queue
#队列:先进先出
q=queue.Queue(2) #队列最大长度,默认是0 无限大 q.put(11)
q.task_done()
q.put(22) q.join()

阻塞进程

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

不阻塞

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

456

345
123
import queue
#队列:优先级
q=queue.PriorityQueue(5) q.put((0,123)) #优先级相同,先进先出
q.put((1,345))
q.put((0,456)) print(q.get())
print(q.get())
print(q.get())
(0, 123)
(0, 456)
(1, 345)
import queue
#队列:双向队列 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.程序解耦合(生产者改变不影响消费者那端)
#!/usr/bin/env python
# -*- coding:utf-8 -*- 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 + "--出票") 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来买票啦--出票
 
线程里锁的机制:
应用程序的最小单位是线程,他们共用这个应用程序里的资源,如果同时对某个数据进行修改的话,就会产生脏数据
解决:锁 
#!/usr/bin/env python
# -*- coding:utf-8 -*- 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
#lock=threading.Lock()
#lock=threading.RLock() #构建锁对象 Lock只能加一重锁 RLock可以加多重锁
lock=threading.BoundedSemaphore(2) #上面两种锁都是每次放行1个线程,这个可放行多个

一次放行2个线程

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

线程池:
#!/usr/bin/env python
# -*- coding:utf-8 -*- 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) 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. 
 
 
 
进程:
共享空间:
#!/usr/bin/env python
# -*- coding:utf-8 -*- from multiprocessing import Process
from multiprocessing import queues
import multiprocessing
from multiprocessing import Manager 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. 深入剖析PE文件

    不赖猴的笔记,转载请注明出处. 深入剖析PE文件 PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一.   ...

  2. VM 映像

     让我们一起欢呼吧!随着最近Microsoft Azure运行时的发布,我们非常高兴地宣布发布 OS映像的继承性产品:新 VM映像.等一下-有些人可能会觉得这听起来有点耳熟.没错,一个月前在旧金山 ...

  3. cocos2dx CCTextFieldTTF

    CCTextFieldTTF是一个提供文本输入的控件. 先上个简单的例子 CCSize size = __winSize; CCTextFieldTTF* textEdit = CCTextField ...

  4. SQL SERVER表不能修改表结构的处理方法

    SQL SERVER表提示不能修改表结构,这究竟是什么原因呢?下面就为您介绍处理该问题的方法,如果您在SQL SERVER表修改方面遇到过问题,不妨一看. 新装的SQL SERVER 2008,打开原 ...

  5. start stack

    Start OpenStack Services After launching your stack by Devstack, you maybe stop some services or reb ...

  6. .Net MVC 入门之Razor语法

    Razor语法 Razor是以后MVC项目中都需要用的, 所以在学MVC的基础的时候,我们的目标:要了解熟悉Razor页面的语法结构,做到灵活使用,so我们马上开始学习Razor,也请你们多评论和推荐 ...

  7. Web前端开发工程师为什么讨厌IE6!

  8. iOS中UIWebView使用JS交互 - 机智的新手

    iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...

  9. sort函数简单调用方法

    向量调用sort函数排序,一般有三个参数,即为sort(v.begin(),v.end(),cmp),第三个传入的是比较函数的地址(函数名),决定你比较的性质,运用灵活 #include<ios ...

  10. TreeSet两种比较

    TreeSet底层数据结构是二叉树 判断对象是否一致是通过是对象自身有比较的方法,即使类实现Comparable接口,重写compareTo方法,自己定义比较规则, 若是不想用元素本身的比较方法,又不 ...