通过这个例子可以证明多线程比单线程运行速度要快,如何用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:
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)