当前位置: 首页 > news >正文

可以做兼职的动漫网站他达拉非什么是

可以做兼职的动漫网站,他达拉非什么是,计算机网站建设实验总结,安徽合肥紧急通报先说一下和flask没有关系的: 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块数据处…

先说一下和flask没有关系的:

我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块数据处理的冲突问题,一个办法就是加互斥锁,另一个办法就是利用threadlocal

ThreadLocal   实现的思路就是给一个进程中的多个线程开辟空间来保存线程中特有的值

代码实现:

1、简单示例:

import threading
# 实例化对象
local_values = threading.local()
def func(num):# 给对象加属性,这个属性就会保存在当前线程开辟的空间中local_values.name = numimport timetime.sleep(1)# 取值的时候也从当前线程开辟的空间中取值print(local_values.name, threading.current_thread().name)
for i in range(20):th = threading.Thread(target=func, args=(i,), name='线程%s' % i)th.start()

打印结果:

0 线程0
1 线程1
2 线程2
3 线程3
10 线程10
9 线程9
4 线程4
8 线程8
5 线程5
7 线程7
6 线程6
13 线程13
11 线程11
17 线程17
15 线程15
14 线程14
16 线程16
12 线程12
18 线程18
19 线程19

 

如果把对象换成一个类对象:

import threading
# 如果是一个类对象,结果就完全不一样class Foo(object):def __init__(self):self.name = 0
local_values = Foo()
def func(num):local_values.name = numimport timetime.sleep(1)print(local_values.name, threading.current_thread().name)
for i in range(20):th = threading.Thread(target=func, args=(i,), name='线程%s' % i)th.start()

打印结果:

19 线程1
19 线程3
19 线程4
19 线程5
19 线程2
19 线程0
19 线程9
19 线程6
19 线程8
19 线程11
19 线程7
19 线程10
19 线程15
19 线程16
19 线程13
19 线程14
19 线程18
19 线程19
19 线程12
19 线程17

 

2、依据这个思路,我们自己实现给线程开辟独有的空间保存特有的值

协程和线程都有自己的唯一标识get_ident,利用这个唯一标识作为字典的key,key对应的value就是当前线程或协程特有的值,取值的时候也拿这个key来取

import threading
# get_ident就是获取线程或协程唯一标识的
try:from greenlet import getcurrent as get_ident # 协程# 当没有协程的模块时就用线程
except ImportError:try:from thread import get_identexcept ImportError:from _thread import get_ident # 线程
class Local(object):def __init__(self):self.storage = {}self.get_ident = get_identdef set(self,k,v):ident = self.get_ident()origin = self.storage.get(ident)if not origin:origin = {k:v}else:origin[k] = vself.storage[ident] = origindef get(self,k):ident = self.get_ident()origin = self.storage.get(ident)if not origin:return Nonereturn origin.get(k,None)
# 实例化自定义local对象对象
local_values = Local()
def task(num):local_values.set('name',num)import timetime.sleep(1)print(local_values.get('name'), threading.current_thread().name)
for i in range(20):th = threading.Thread(target=task, args=(i,),name='线程%s' % i)th.start()

 

 

3、因为要不停的赋值取值,就想到了__setattr__和__getattr__方法,但是要注意初始化时赋值和__setattr__方法中赋值又可能产生递归的问题

import threading
try:from greenlet import getcurrent as get_ident # 协程
except ImportError:try:from thread import get_identexcept ImportError:from _thread import get_ident # 线程
class Local(object):def __init__(self):# 这里一定要用object来调用,因为用self调用的就会触发__setattr__方法,__setattr__方法里# 又会用self去赋值就又会调用__setattr__方法,就变成递归了object.__setattr__(self, '__storage__', {})object.__setattr__(self, '__ident_func__', get_ident)def __getattr__(self, name):try:return self.__storage__[self.__ident_func__()][name]except KeyError:raise AttributeError(name)def __setattr__(self, name, value):ident = self.__ident_func__()storage = self.__storage__try:storage[ident][name] = valueexcept KeyError:storage[ident] = {name: value}def __delattr__(self, name):try:del self.__storage__[self.__ident_func__()][name]except KeyError:raise AttributeError(name)
local_values = Local()
def task(num):local_values.name = numimport timetime.sleep(1)print(local_values.name, threading.current_thread().name)
for i in range(20):th = threading.Thread(target=task, args=(i,),name='线程%s' % i)th.start()

 

 

我们再说回Flask,我们知道django中的request是直接当参数传给视图的,这就不存在几个视图修改同一个request的问题,但是flask不一样,flask中的request是导入进去的,就相当于全局变量,每一个视图都可以对它进行访问修改取值操作,这就带来了共享数据的冲突问题,解决的思路就是我们上边的第三种代码,利用协程和线程的唯一标识作为key,也是存到一个字典里,类中也是采用__setattr__和__getattr__方法来赋值和取值

分情况:

对于单进程单线程:没有影响,基于全局变量

对于单进程多线程:利用threading.local()  对象

对于单进程单线程的多协程:本地线程对象就做不到了,要用自定义,就是上边的第三个代码

 

一共涉及到四个知识点:

1、唯一标识

2、本地线程对象

3、setattr和getattr

4、怎么实现

转载于:https://www.cnblogs.com/wanghl1011/articles/8619148.html

http://www.lbrq.cn/news/2370907.html

相关文章:

  • 怎么设置网站名称互联网推广怎么做
  • 电商网站建设赏析广州网络推广seo
  • 网站建设项目描述范文营销渠道
  • 做3d兼职网站海外广告投放公司
  • 网站代码怎么做百度网址大全下载安装
  • 做网站的手机软件推广网址
  • 门户网站建设管理工作方案成都网站seo诊断
  • 重庆电商平台网站建设免费的个人网站怎么做
  • 加强政民互动 建设交流型政府门户网站活动策划
  • 网店代运营网seo应该如何做
  • 南宁做网站推广的公司哪家好网站推广专家
  • 公司开网站干嘛公司网站营销
  • 网站建设信息服务费计入什么科目seo点击软件手机
  • 织梦做的网站怎么样免费建站网站网页
  • 自己如何做公司网站口碑营销渠道
  • 苏州专业做网站公司哪家好百度加盟
  • b2c类型的网站农夫山泉软文300字
  • 开发网站网络公司有哪些长沙关键词快速排名
  • 专业做包装设计网站电子商务主要学什么内容
  • 汽车网站方案百度平台订单查询
  • 上海网站案例网络营销课程总结
  • 佛山专业网站建设广告推广图片
  • python网站开发 完整例子推广平台哪个效果最好
  • 毕业设计做网站大小有什么要求免费推广的平台都有哪些
  • 枣庄做网站建设的公司比较好网站制作公司
  • 网站制作需要什么域名注册
  • 做时时彩网站平台有哪些网络推广优化
  • 网站301怎么做seo流程
  • 国内最先做弹幕的网站网站免费推广平台
  • 美食网站建设策划书竞价网站
  • qt 中英文翻译 如何配置和使用
  • 在 CentOS 8 上彻底卸载 Kubernetes(k8s)
  • Python 程序设计讲义(2):Python 概述
  • cursor使用mcp连接mysql数据库,url方式
  • 15.图像 模板轮廓检测
  • AiPy+豆包:数据分析可视化,一键生成GUI工具