python中线程的使用(可以进行数据的共享)

通过这个例子可以证明多线程比单线程运行速度要快,如何用map拿取各个线程执行之后的数据。(由于GIL锁的原因,多个线程只能用一个cpu,这时多进程的执行效率要比多线程高,至于多线程为什么快,大家可以去搜一下)
"""
验证多线程运行时间比单线程运行时间快多少
用了一个计算时间的装饰器 输出运行时间
可以发现多线程在我的电脑上运行时间为5s 单线程运行时间为16s  差别很大
"""
from functools import wraps
import concurrent.futures
import math, datetime

# 函数运行时间装饰器
def run_timer(func):
    @wraps(func)
    def wrap(*args, **kwargs):
        begin_time = datetime.datetime.now()
        result = func(*args, **kwargs)
        end_time = datetime.datetime.now()
        print(f'{func.__name__}函数运行时间:{end_time-begin_time}')
        return result
    return wrap


PRIMES = [
    1116281,
    1297337,
    104395303,
    472882027,
    533000389,
    817504243,
    982451653,
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419
] * 5


def is_prime(n):
    """判断素数"""
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

@run_timer
def mult_main():
    """多线程运行函数"""
    with concurrent.futures.ProcessPoolExecutor() as executor:
        # map(fn, *iterables, timeout=None)
        # 第一个参数fn是线程执行的函数;第二个参数接受一个可迭代对象;
        # 第三个参数timeout跟wait()的timeout一样,
        # 但由于map是返回线程执行的结果,如果timeout小于线程执行时间会抛异常TimeoutError。
        # map的返回是有序的,它会根据第二个参数的顺序返回执行的结果:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))

@run_timer
def signal_main():
    """单线程运行函数"""
    for prime in PRIMES:
        flag= is_prime(prime)
        print(f'{prime} is prime: {flag}')

if __name__ == '__main__':
    mult_main()  # 多线程运行
    signal_main()  # 单线程运行
并且各个线程之间和主线程内存空间的数据可以共享,可以用global字段进行数据的共享。
from threading import Thread

n=100
def task():
    global n
    n=0
    print(f'将n置为{n}')

if __name__ == '__main__':
    t=Thread(target=task,)  # 执行一个线程
    t.start()
    t.join()

    print('主程序',n)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值