python学习笔记——正则表达式和多线程

正则表达式

30分钟正则表达式
python中对于正则表达式使用re模块处理
因为python本身也用转义,所以可以在字符串前使用r前缀,这样就不用考虑转义问题了。

match()

match()方法判断是否匹配成功,然会一个match()对象,否则返回None。

import re
test = '字符串'
if re.match(r'正则表达式',test):
	print('ok')
else:
	print('failed')

split()

re模块中的split([正则表达式],[字符串])方法可以使用正则表达式分割字符串,返回值为分割后的字符串字典。

()括号分组

使用()可以提取分组,^(d{3})-(d{3,8})$前后为两个组,可以直接从匹配后的字符串中提取出两部分内容。
如果正则表达式中定义了组,那么就可以在match()对象中使用group()方法提取字符串。
group(0)为源字符串,group(1)为第一个子串,group(2)为第二个子串。

compile()

如果一个正则表达式需要重复使用,那么应该预编译该正则表达式。
re.compile([正则表达式])方法用于预编译正则表达式。

多线程

任何进程默认都会启动一个线程,这个线程被称为主线程,主线程又可以启动新的线程。
threading模块中的current_thread()函数,永远返回当前线程的实例。主线程实例的名字为MainThread,子线程的名字在创建时指定。名字没啥意义,就是需要的时候可以打印出来。

Lock

多进程中,同一个变量,各自有一份拷贝存在于每个进程中;多线程中,所有变量都由所有线程共享。
所以为了避免多个线程使变量错乱,需要给线程加锁,防止线程之间修改出现冲突。当一个线程获得锁之后,其他线程就不能同时执行该线程运行中的方法,只能等待锁被释放后才可以更改。无论多少线程,同一时刻只有一个线程持有该锁,所以不会造成修改的冲突。
threading模块中的lock()方法可以创建一个锁。

lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 先要获取锁:
        lock.acquire()
        try:
            # 放心地改吧:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()

锁在用完后一定要释放,否则其他线程将会变成死线程。

多线程编程时,模型复杂,容易发生冲突,必须加锁隔离线程,同时也要小心死锁。

python解释器设计时有GIL全局锁,所以python多线程无法利用多核。

ThreadLocal

import threading
local_school = threading.local()
def process_student():
	std = local_school.student
	print('hello %s (in %s)' % (std,threading.current_thread().name))
def process_thread(name):
	local_school.student = name
	process_student()

t1 = threading.Thread(target=process_thread,args=('Lihua',),name='线程A')
t2 = threading.Thread(target=process_thread,args=('Hanmeimei',),name='线程B')
t1.start()
t2.start()
t1.join()
t2.join()

一个ThreadLocal变量虽然是全局变量,但是每个线程都只能操作自己线程内的变量副本,互不干扰。就像班里的点名簿,每个班都有可能有一个叫李华的同学,但是每个班在点名时点的是本班的李华,和其他班的重名同学不是一个人。

原文地址:https://www.cnblogs.com/pr1s0n/p/12246018.html