Python修炼,并行编程(三)<2016.4.26>

655 查看

今天主要写三个东西,一个是并行编程里面的Lock,另外两个是字符串处理的小任务

  • 先说Lock

    如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
    使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。如下:
    多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。
    考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,而线程"print"负责从前往后读取列表并打印。
    那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半0一半1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。
    锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。
    经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1的尴尬场面。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
       # 获得锁,成功获得锁定后返回True
       # 可选的timeout参数不填时将一直阻塞直到获得锁定
       # 否则超时后将返回False
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # 释放锁
        threadLock.release()
def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
threadLock = threading.Lock()
threads = []
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 开启新线程
thread1.start()
thread2.start()
# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)
# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"
  • 一道算法题

    对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。
    样例


    Paste_Image.png


    然后这个我想了两种解法,其实是一种方法,只是判断边界条件的方式不一样。一会儿测试一下哪一种速度快。

  • 先贴第一个
    思路是先判断边界条件,利用双层for循环,逐步后移判断是否相等,如果target循环完还是相等就会返回相应的res,否则就会返回-1。

    class Solution:
      def strStr(self, source, target):
          # write your code here
          if source == None or target == None or len(source)<len(target):
              return -1
          if source !="" and source == target:
              return 0
          if source =="" or target =="":
              return 0
          for i in range(len(source)-len(target)+1):
              flag = True
              res = i
              for char in target:
                  if char == source[i]:
                      i +=1
                  else:
                      flag = False
              if flag:
                  return res
          return -1

    *然后我又写了一个很傻的方法,很不幸没有通过,就是我想用re的search去判断边界条件,没有成功

    import re
    class Solution:
      def strStr(self, source, target):
          # write your code here
          if source ==None or target == None or len(source)<len(target):
              return -1
          if source == "" or target=="":
              return 0
          if re.findall(target,source)>0:
              for i in range(len(source)-len(target)+1):
                  flag = True
                  res = i
                  for char in target:
                      if char == source[i]:
                          i +=1
                      else:
                          flag = False
                  if flag:
                      return res
          return -1
  • 随机生成十个用户名和密码,并把密码做加密处理

import random
import hashlib
n=8
z=0
while z<10:
    z=z+1
    charactor='qwertyuiopasdfghjklzxcvbnm0123456789'
    a=[0]*n
    b=[0]*n
    for i in xrange(n):
        a[i]=charactor[random.randint(0,len(charactor)-1)]
        b[i]=charactor[random.randint(0,len(charactor)-1)]
    name=''.join(a)
    password=''.join(b)
    password_md5=hashlib.md5(password).hexdigest()

    print name
    print password
    print password_md5
    x = open('user.txt','a')
    x.write(name+'\n'+str(password_md5)+'\n')
    x.close()

-----------------

  • 处理下面一段数据
"ID","linenum","fstation","lstation","linelong","co","kongtiao","yuepiao","piaozhi","pay","ftime","ltime","station"
43,"1(马官营-四惠站)","马官营","四惠站","22.00","客六","否","有效","单一票制","1.00","5:00","23:00","1 马官营 

2 六里桥北里 

3 公主坟南站 

4 公主坟 

5 军事博物馆 

6 木樨地 

7 工会大楼 

8 礼士路 

9 复兴门 

10 西单 

11 中山公园 

12 天安门 

13 东单 

14 北京站口 

15 日坛路 

16 永安里 

17 大北窑 

18 郎家园 

19 八王坟 

20 四惠站 
"

把它的信息做个简单处理:

import codecs
import re
beijing = codecs.open("beijing_jt.csv","r","utf-8")
f = beijing.readlines()
s_tmp = "".join(f[1:40])
s_split = s_tmp.split(',')
print s_split[1]
s_split_split=s_split[-1].split('\r\n \r\n')
pattern = (r'(?P<number>\d+)\s(?P<name>\D+)')
for tmp in re.findall(pattern,s_split[-1]):
    print tmp[0],tmp[1]

会变成下面的样子


Paste_Image.png