zoukankan      html  css  js  c++  java
  • 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变量虽然是全局变量,但是每个线程都只能操作自己线程内的变量副本,互不干扰。就像班里的点名簿,每个班都有可能有一个叫李华的同学,但是每个班在点名时点的是本班的李华,和其他班的重名同学不是一个人。

  • 相关阅读:
    BZOJ 1176: [Balkan2007]Mokia
    BZOJ 4034: [HAOI2015]T2
    BZOJ 4031: [HEOI2015]小Z的房间
    BZOJ 4128: Matrix
    JSP学习-08-JavaBean
    JSP学习-标准标签库
    电影剧本写作基础
    JSP学习-09-自定义标签
    JSP学习-07Cookie 与Session
    JSP学习-06过滤器
  • 原文地址:https://www.cnblogs.com/pr1s0n/p/12246018.html
Copyright © 2011-2022 走看看