Python列表推导式与生成器表达式用法示例,python使用锁访问共享变量实例解析

本文实例讲述了Python列表推导式与生成器表达式用法。分享给大家供大家参考,具体如下:

Nginx配置文件中没有相关的rewrite跳转规则,那么就应该是MediaWiki的PHP程序做的跳转,但是,遍历了MediaWiki目录下的所有文件以及查询了MySQL数据库中的每个表,都没有发现记录有这个域名。后来,通过查看源代码发现MediaWiki是根据$_SERVER[‘SERVER_NAME’]做的跳转,顺藤摸瓜,发现了下列问题:

本文研究的主要是python使用锁访问共享变量,具体介绍和实现如下。

和列表一样,列表推导式也采用方括号[]表示,并且用到了一个简写版的for循环,第一部分是一个生成结果列表元素的表达式,第二部分是一个输入表达式上的循环。阅读理解列表表达式的推荐做法是先从里面的for循环开始,向右查看是否有if条件,然后将推导式开始的那个表达式映射到每一个匹配的元素上去。

  在一个Nginx虚拟主机中,可以绑定多个server_name,例如:
   图片 1

python
做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon中的threading模块提供了lock对象,lock中的acquire方法用于获取一个锁,而release用于释放一个锁。当一个线程取得锁时,它变获得了共享变量的访问权,此时进入阻塞状态,若其它线程申请访问这个变量,则必须等到这个线程调用release方法释放这个锁。下面是python中使用锁的实例:

>>> even_numbers = [x for x in range(10) if x%2 == 0]
>>> even_numbers
[0,2,4,6,8]

  而server_name的先后顺序的不同,对PHP程序中使用$_SERVER[“SERVER_NAME”]或getenv(‘SERVER_NAME’)获取服务器域名是有影响的:
   图片 2

#!/usr/bin/env python 
import threading,time 
q=threading.Lock()  #create a lock object 
def mythread(): 
  global a 
  q.acquire()   #acquire the lock 
  a=threading.currentThread().getName() 
  print "a is modified by",a 
  q.release()   #release the lock 

for i in range(1,4): 
  t=threading.Thread(target=mythread,name="Thread %d"%i) 
  t.start() 

以上例子展示了使用if语句来过滤元素。

  
图片 3
  $_SERVER[“SERVER_NAME”]或getenv(‘SERVER_NAME’)获取的始终将是Nginx
server_name配置中的第一个域名,这一点在程序开发中需要注意。这第一个域名就相当于Apache虚拟主机配置中的ServerName,后面的域名就相当于Apache的ServerAlias。

如果一个线程想多次获取资源访问权,在上面的程序中连续两次使用acquire()
,将会造成死锁现象,因为第一次申请到的资源还没有来得及释放,就进行了第二次申请。python中的threading模块提供了可重入锁RLock,RLock提供了计数器。一个线程申请到某个资源,计数器会加1,释放掉这个资源计数器会减1.这样,一个线程可以多次请求同一个资源,在所有请求都被释放后,其它线程才允许获取这个锁。上面的代码做简单修改,可得:

Python还支持另外一种和列表表达式类似的结构,叫做生成器表达式(generator
expression),除了它有一种称之为“惰性计算”的特点以外,它和列表推导式的用法基本一致。它的工作方式是每次处理一个对象,而不是一口气处理和构造整个数据结构,这样做的潜在优点是可以节省大量的内存。

您可能感兴趣的文章:

  • Nginx
    安装笔记(含PHP支持、虚拟主机、反向代理负载均衡)
  • 为nginx设置默认虚拟主机(空主机头,默认主机头)
  • nginx
    虚拟主机设置实例(多网站配置)
  • Nginx中虚拟主机与指定访问路径的设置方法讲解
  • nginx配置虚拟主机vhost的方法详解
#!/usr/bin/env python 
import threading,time 
q=threading.RLock()    #create a lock object 
def mythread(): 
  global a 
  q.acquire()    #acquire the lock 
  a=threading.currentThread().getName() 
  print "a is modified by",a 
  q.acquire() 
  a=threading.currentThread().getName() 
  print "a is modified by %s the second time"% a 
  q.release()    
  q.release()    #release the lock 
for i in range(1,4): 
  t=threading.Thread(target=mythread,name="Thread %d"%i) 
  t.start() 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图