python多线程和多进程

GIL全局锁,全局解释器锁
I/O密集型应用和CPU密集型应用

import threading
import time

class LoopThread(threading.Thread):
    n = 0
    def run(self):
        while self.n < 5:
            print(self.n)
            now_thread = threading.current_thread()
            print(now_thread.name)
            time.sleep(1)
            self.n += 1

if __name__ == '__main__':
    now_thread = threading.current_thread()
    print(now_thread.name)
    t = LoopThread(name='loop_thead_loop')
    t.start()
    t.join()

同步与互斥:锁机制
Lock
RLock
Lock和RLock的区别: Rlock可以重复锁
锁定的语法:

with lock:
def change_it(n):
    """ 改变我的余额 """
    global balance

    # 方式一,使用with
    with your_lock:
        balance = balance + n
        time.sleep(2)
        balance = balance - n
        time.sleep(1)
        print('-N---> {0}; balance: {1}'.format(n, balance))

    # 方式二
    # try:
    #     print('start lock')
    #     # 添加锁
    #     your_lock.acquire()
    #     print('locked one ')
    #     # 资源已经被锁住了,不能重复锁定, 产生死锁
    #     your_lock.acquire()
    #     print('locked two')
    #     balance = balance + n
    #     time.sleep(2)
    #     balance = balance - n
    #     time.sleep(1)
    #     print('-N---> {0}; balance: {1}'.format(n, balance))
    # finally:
    #     # 释放掉锁
    #     your_lock.release()
    #     your_lock.release()

CONDITION

多线程调度和优化

import time
import threading
from concurrent.futures import ThreadPoolExecutor
from multiprocessing.pool import ThreadPool, Pool


def run(n):
    """
    线程要做的事情
    :param n:
    :return:
    """
    time.sleep(2)
    print(threading.current_thread().name,n)


def main():
    """使用传统的方法来做任务"""
    t1 = time.time()
    for n in range(100):
        run(n)
    print(time.time() - t1)

def main_use_thread():
    """资源有限,使用线程优化任务"""
    ls = []
    t1 = time.time()
    for count in range(10):
        for i in range(10):
            t = threading.Thread(target = run,args=(i,))
            ls.append(t)
            t.start()
        for l in ls:
            l.join()
    print(time.time()-t1)

def main_use_pool():
    """使用线程池优化"""
    t1 = time.time()
    n_list = range(100)
    pool = Pool(10)
    pool.map(run,n_list)
    pool.close()
    pool.join()
    print(time.time() -t1)

def main_use_executor():
    t1 = time.time()
    n_list = range(100)
    with ThreadPoolExecutor(max_workers=10) as executor:
        executor.map(run,n_list)
    print(time.time()-t1)

if __name__ == '__main__':
    # main()
    # main_use_thread()
    # main_use_pool()
    main_use_executor()
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务