7.20 python线程3
2018-7-20 18:46:49 去俺弟家玩去 后天回来
1.复习
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 8:56
# !@Author TrueNewBee # 正确的学习方法
# input
# output
# correct 纠正 # 线程:
# 1.线程是进程中的执行单位
# 2.线程是cpu执行的最小单位
# 3.线程之间资源共享
# 4.线程的开启和关闭以及切换的时间开销远远小于进程
# 5.线程本身可以在同一时间使用多个cpu
# python 与 线程
# CPython解释器在解释代码过程中容易产生数据不安全的问题
# GIL全局解释器锁 锁的是线程
# threading
2.守护线程
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 9:04
# !@Author TrueNewBee
import time
from threading import Thread def func1():
while True:
print('*'*10)
time.sleep(1) def func2():
print('in func2')
time.sleep(5) if __name__ == '__main__':
t = Thread(target=func1, )
t.daemon = True
t.start()
t2 = Thread(target=func2, )
t2.start()
t2.join()
print('主线程') # 守护进程随着主进程代码的结束而结束(进程间资源不共享,所以想咋结束咋结束)
# 守护线程会在主线程结束之后等待其他子线程的结束才结束(线程间资源共享,所以不能主线程不能立马结束) # 主进程在执行完自己的代码之后不会立即结束,而是等待子进程结束之后 挥手子进程的资源 # import time
# from multiprocessing import Process
#
#
# def func():
# time.sleep(5)
#
#
# if __name__ == '__main__':
# Process(target=func, ).start()
3.锁
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 9:29
# !@Author TrueNewBee
# import time
# from threading import Thread, Lock # def func(lock1):
# global n
# lock1.acquire() # 加上一个锁
# # n = 1 python内部就是下面执行的
# temp = n
# time.sleep(0.2)
# n = temp - 1 # 9 刚取回来还没来得及赋值又被别人拿走了,所以得自己加个锁不让被人拿走
# lock1.release() # 换钥匙
#
#
# n = 10
# t_list = []
# lock = Lock()
# for i in range(10):
# t = Thread(target=func, args=(lock, ))
# t.start()
# t_list.append(t)
# for t in t_list:
# t.join()
# print(n) # 不加锁是9 加锁是 0 # 科学家吃面问题 经典死锁问题
# noodle_lock = Lock()
# fork_lock = Lock()
# 互斥锁
#
#
# def eat1(name):
# noodle_lock.acquire()
# print('%s拿到面条啦' % name)
# fork_lock.acquire()
# print('%s拿到叉子啦' % name)
# print('%s吃面' % name)
# fork_lock.release()
# noodle_lock.release()
#
#
# def eat2(name):
# fork_lock.acquire()
# print('%s拿到叉子啦' % name)
# time.sleep(1)
# noodle_lock.acquire()
# print('%s拿到面条啦' % name)
# print('吃面')
# noodle_lock.release()
# fork_lock.release()
#
#
# if __name__ == '__main__':
# Thread(target=eat1, args=('alex', )).start()
# Thread(target=eat2, args=('Egon',)).start()
# Thread(target=eat1, args=('bossJin',)).start()
# Thread(target=eat2, args=('zeZha',)).start()
import time
from threading import RLock, Thread fork_lock = noodle_lock = RLock() # 一个钥匙串上的两把钥匙
# 递归锁 为了解决死锁问题,可以acquire()多次, def eat1(name):
noodle_lock.acquire() # 一把钥匙
print('%s拿到面条啦' % name)
fork_lock.acquire()
print('%s拿到叉子啦' % name)
print('%s吃面' % name)
fork_lock.release()
noodle_lock.release() def eat2(name):
fork_lock.acquire()
print('%s拿到叉子啦' % name)
time.sleep(1)
noodle_lock.acquire()
print('%s拿到面条啦' % name)
print('%s吃面' % name)
noodle_lock.release()
fork_lock.release() if __name__ == '__main__':
Thread(target=eat1, args=('alex', )).start()
Thread(target=eat2, args=('Egon',)).start()
Thread(target=eat1, args=('bossJin',)).start()
Thread(target=eat2, args=('zeZha',)).start()
4.条件和定时器
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 11:25
# !@Author TrueNewBee
import time
from threading import Semaphore, Thread def func(sem1, a, b):
# 同一时间就让四个线程执行代码
sem1.acquire()
time.sleep(1)
print(a+b)
sem1.release() if __name__ == '__main__':
sem = Semaphore(4)
for i in range(10):
t = Thread(target=func, args=(sem, i, i+5))
t.start()
5.事件
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 11:31
# !@Author TrueNewBee
# 事件被创建的时候
# False状态
# wait() 阻塞
# True状态
# wait() 非阻塞
# clear 设置状态为False
# set 设置状态为True # 数据库- 文件夹
# 文件夹里有好多excel表格
# 1.能够更方便的对数据进行增删改查
# 2.安全访问的机制 # 伪代码 看现象:
# 起两个线程
# 第一个线程:连接数据库
# 等待一个信号,告诉我我们之间的网络是通的
# 连接数据库
# 第二个线程:检测与数据库之间的网络情况是否连通
# time.sleep(0,2)
# 将事件状态设置为True import time
import random
from threading import Thread, Event def connect_db(e1):
count = 0
while count < 3:
# 连接三次
e1.wait(0.5) # 状态是False的时候,我只等待1s
if e1.is_set() == True:
print('连接成功')
break
else:
count += 1
print('第%s次连接失败' % count)
else:
# 连接三次都都没连上,主动抛出异常
raise TimeoutError('数据库连接超时') def check_web(e2):
time.sleep(random.randint(0, 3))
e2.set() if __name__ == '__main__':
e = Event()
t1 = Thread(target=connect_db, args=(e, ))
t2 = Thread(target=check_web, args=(e, ))
t1.start()
t2.start()
7.20 python线程3的更多相关文章
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- [python] 线程简介
参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- [python] ThreadPoolExecutor线程池 python 线程池
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...
- Python学习——Python线程
一.线程创建 #方法一:将要执行的方法作为参数传给Thread的构造方法 import threading import time def show(arg): time.sleep(2) print ...
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- python 线程,GIL 和 ctypes(转)
原文:http://zhuoqiang.me/python-thread-gil-and-ctypes.html GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程 ...
- python 线程、多线程
复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...
- python 线程 进程 协程 学习
转载自大神博客:http://www.cnblogs.com/aylin/p/5601969.html 仅供学习使用···· python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和 ...
随机推荐
- yield 举例
示例代码: 神奇的地方在于yield返回的是一个IEumerable,可以直接枚举. // yield-example.cs using System; using System.Collection ...
- 源码分析八(org.springframework.util包之StringUtils类))
一:spring框架util包中的StringUtils类主要是处理关于字符串 的功能方法,下面直接结合代码分析: //判断字符串是否为空,如果为nul或者""则返回true,否则 ...
- springboot+jps+druid项目搭建
pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- [Object Tracking] Identify and Track Specific Object
Abstract—Augmented Reality (AR) has become increasingly popular in recent years and it has a widespr ...
- Oracle的闪回技术--闪回已删除的表
注意闪回技术只能保护非系统表决空间中的表,而且表空间必须本地管理, 外键将不可以被恢复, 索引和约束的名字将会被命名为以BIN开头,由系统生成的名字 查看是否开启闪回: SQL> show pa ...
- DOM的学习
今天学习了DOM,感觉学习起来真的没那么简单啦,这不是一个好现象啊,只有依靠自己大补课,嘿嘿,具体的总结了一下,今天学习的其实并不多,仅仅学习了不同的节点类型,但是知识还是蛮碎的,要一点一点的总结,昨 ...
- js for循环与for in循环的区别
for循环可一遍历数组,而for in循环可以遍历数组和对象 使用for in循环会将Array当成对象遍历,而Array的存取速度明显比Object要快.所以使用for循环遍历数组比for in循环 ...
- C++程序中调用其他exe可执行文件方法
在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...
- Android中Adapter总结
根据一个制作列表的程序开始练手,结果就出现了学习安卓的第一个代码问题 运行程序发现,虽然报错,但是可以成功运行程序. Android中Adapter功能为 显示ListView,最常用的有ArrayA ...
- Android开发训练之第五章第五节——Resolving Cloud Save Conflicts
Resolving Cloud Save Conflicts IN THIS DOCUMENT Get Notified of Conflicts Handle the Simple Cases De ...