今天主要写三个东西,一个是并行编程里面的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。
样例
然后这个我想了两种解法,其实是一种方法,只是判断边界条件的方式不一样。一会儿测试一下哪一种速度快。
先贴第一个
思路是先判断边界条件,利用双层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]
会变成下面的样子
2025 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123