Python小推车动态语言Ruby Python python学习

Python学习打call第三十九天:线程同步与并发

2019-03-14  本文已影响15人  暖A暖

1.线程之间的几种通信方式

2.Event事件

from threading import Thread, Event
import time

def teacher(event: Event):
    print('I am teacher , waiting for your homework')
    event.wait()
    print("I am teacher, already obtaining student's homework ")
    
def student(event: Event):
    finished_homework = []
    while len(finished_homework) < 10:
        time.sleep(1)
        print('I am student, finished one homework')
        finished_homework.append(1)
    else:
        print('student finish homework')
        event.set()
        
if __name__ == '__main__':
    event = Event()
    Thread(target=student, args=(event,)).start()
    Thread(target=teacher, args=(event,)).start()

event实例对象的对象方法:

3.线程锁

thread.allocate_lock()
threading.Lock()
# 示例1:学生完成作业的总数最后为1009, 出现了临界资源争抢的问题
import time
from threading import Thread
homework_list = []

def student(number):
    while len(homework_list) < number:
        time.sleep(0.001)
        homework_list.append(1)
    print(len(homework_list))

if __name__ == '__main__':
    for i in range(10):
        Thread(target=student, args=(1000, )).start()
    time.sleep(3)
    print('完成作业的总数为: {}'.format(len(homework_list)))

# 示例2:对示例1的修正,使用锁机制
import time
import threading
from threading import Thread, Lock
homework_list = []

# 全局阻塞锁
lock = Lock()
def student(number):
    while True:
        lock.acquire()  # 一定是在获取临界资源之前加锁
        if len(homework_list) >= number:
            break
        time.sleep(0.001)
        homework_list.append(1)
        lock.release()   # 完成任务的时候释放锁,让其他的线程获取到临界资源
        print('current_thread={}, homework_list={}'.format(threading.current_thread().name, len(homework_list)))

if __name__ == '__main__':
    for i in range(10):
        Thread(target=student, name='student {}'.format(i), args=(1000, )).start()
    time.sleep(3)
    print('完成作业的总数为: {}'.format(len(homework_list)))

4.锁在with语句中的使用

import time
import threading
from threading import Thread, Lock
homework_list = []

# 全局阻塞锁
lock = Lock()
def student(number):
    while True:
        with lock:
            if len(homework_list) >= number:
                break
            time.sleep(0.001)
            homework_list.append(1)

        print('current_thread={}, homework_list={}'.format(threading.current_thread().name, len(homework_list)))

if __name__ == '__main__':
    for i in range(10):
        Thread(target=student, name='student {}'.format(i), args=(1000, )).start()
    time.sleep(3)
    print('完成作业的总数为: {}'.format(len(homework_list)))

5.线程池

from concurrent.futures import ThreadPoolExecutor
import requests

def fetch_url(url):
    result = requests.get(url=url, )
    return result.text

# 创建10个线程队列的线程池
pool = ThreadPoolExecutor(10)

# 获取任务返回对象
a = pool.submit(fetch_url, 'http://www.baidu.com')
# 取出返回的结果

x = a.result()
print(x)  # 获得百度的源码

6.全局解释器锁

对于全局解释器锁的解决方案:

多线程和多进程解决方案:

参考:https://www.9xkd.com/user/plan-view.html?id=4240003103

上一篇 下一篇

猜你喜欢

热点阅读