当前位置:   article > 正文

头歌python实训通关八——进程和线程——基础_头哥python多线程-求合数个数

头哥python多线程-求合数个数

第1关:求素数的个数

任务描述

本关任务:使用Python多进程求素数个数。

相关知识

为了完成本关任务,你需要掌握:1.多进程的使用。

编程要求

根据提示,在右侧编辑器补充代码,用多进程实现求区间[1,n]里素数的个数。 说明:求区间内素数个数是计算型密集任务,且可以将区间分成互不相关的子区间,分别使用进程对他们求解,正是多进程的用武之地!

测试说明

平台会对你编写的代码进行测试:

测试输入:5; 预期输出: 3

测试输入:10; 预期输出: 4`

  1. import math
  2. from multiprocessing import cpu_count
  3. from multiprocessing import Pool
  4. def isPrime(n):
  5. # 判断数字是否为素数
  6. # 请在此处添加代码 #
  7. # *************begin************#
  8. if n<=1:
  9. return False
  10. for i in range(2,int(math.sqrt(n))+1):
  11. if n%i == 0:
  12. return False
  13. return True
  14. # **************end*************#
  15. def howMany(T):
  16. # 计算给定区间含有多少个素数
  17. # 请在此处添加代码 #
  18. # *************begin************#
  19. sum = 0
  20. for i in range(T[0],T[1]+1):
  21. if isPrime(i):
  22. sum+=1
  23. return sum
  24. # **************end*************#
  25. def separateNum(N, CPU_COUNT):
  26. # 对整个数字空间N进行分段CPU_COUNT
  27. # 请在此处添加代码 #
  28. # *************begin************#
  29. list=[[i*(N//CPU_COUNT)+1,(i+1)*(N//CPU_COUNT)] for i in range(0,CPU_COUNT)]
  30. list[0][0]=1
  31. if list[CPU_COUNT-1][1]<N:
  32. list[CPU_COUNT-1][1]=N
  33. return list
  34. # **************end*************#
  35. if __name__ == '__main__':
  36. N = int(input())
  37. # 多进程
  38. CPU_COUNT = cpu_count() ##CPU内核数 本机为8
  39. pool = Pool(CPU_COUNT)
  40. sepList = separateNum(N, CPU_COUNT)
  41. result = []
  42. for i in range(CPU_COUNT):
  43. result.append(pool.apply_async(howMany, (sepList[i], )))
  44. pool.close()
  45. pool.join()
  46. # ans = 0
  47. list = [res.get() for res in result]
  48. print(sum(list), end = '')

第2关:求合数的个数。

任务描述

本关任务:使用 Python 多线程,实现求合数的个数。

相关知识

为了完成本关任务,你需要掌握:1.python多线程。

编程要求

根据提示,在右侧编辑器补充代码,使用多线程计算给定区间合数的个数。 本关已给出素数判定方法,需要你补充主函数中相关内容,实现统计合数个数的相关内容。

测试说明

平台会对你编写的代码进行测试:

测试输入:5; 预期输出: 1

测试输入:10; 预期输出: 5

  1. import threading
  2. import math
  3. ans = 0
  4. lock = threading.Lock()
  5. import threading
  6. import math
  7. ans = 0
  8. lock = threading.Lock()
  9. def isPrime(n):
  10. # 判断数字是否为素数
  11. global ans
  12. if n <= 1:
  13. return False
  14. for i in range(2, int(math.sqrt(n)) + 1):
  15. if n % i == 0:
  16. return False
  17. return True
  18. def howMany(T):
  19. # 计算给定区间含有多少个素数
  20. sum = 0
  21. for i in range(T[0], T[1] + 1):
  22. if isPrime(i):
  23. sum += 1
  24. lock.acquire()
  25. try:
  26. global ans
  27. ans += sum
  28. finally:
  29. lock.release()
  30. def seprateNum(N, CPU_COUNT):
  31. # 对整个数字空间N进行分段CPU_COUNT
  32. list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
  33. list[0][0] = 1
  34. if list[CPU_COUNT - 1][1] < N:
  35. list[CPU_COUNT - 1][1] = N
  36. return list
  37. if __name__ == '__main__':
  38. N = int(input())
  39. threadNum = 32
  40. # 请在此处添加代码 #
  41. # *************begin************#
  42. t=[]
  43. sepList=seprateNum(N,threadNum)
  44. for i in range(0,threadNum):
  45. t.append(threading.Thread(target=howMany,args=(sepList[i],)))
  46. t[i].start()
  47. for i in range(0,threadNum):
  48. t[i].join()
  49. print(N-1-ans,end='')
  50. # **************end*************#

第3关:交替打印foobarpython


任务描述

本关任务:输入一个数n,打印n个foobarpython。

相关知识

为了完成本关任务,你需要掌握:1.线程的使用,2.线程锁的使用。

编程要求

根据提示,在右侧编辑器补充代码,输出n个foobarpython。

测试说明

平台会对你编写的代码进行测试:

测试输入:1; 预期输出: foobarpython 解释:“foobarpython”将输出1次

测试输入:5; 预期输出: foobarpythonfoobarpythonfoobarpythonfoobarpythonfoobarpython 解释:“foobarpython”将输出5次

  1. import threading
  2. import sys
  3. import time
  4. def showfoo(n):
  5. '''
  6. :param n: 要输出foobarpython的次数
  7. :return: 无返回,可直接输出
  8. '''
  9. # 请在此处添加代码 #
  10. # *************begin************#
  11. for i in range(n):
  12. lockpython.acquire()
  13. print('foo',end='')
  14. sys.stdout.flush()
  15. lockfoo.release()
  16. time.sleep(0.2)
  17. # **************end*************#
  18. def showbar(n):
  19. '''
  20. :param n: 要输出foobarpython的次数
  21. :return: 无返回,可直接输出
  22. '''
  23. # 请在此处添加代码 #
  24. # *************begin************#
  25. for i in range(n):
  26. lockfoo.acquire()
  27. print('bar',end='')
  28. sys.stdout.flush()
  29. lockbar.release()
  30. time.sleep(0.2)
  31. # **************end*************#
  32. def showpython(n):
  33. '''
  34. :param n: 要输出foobarpython的次数
  35. :return: 无返回,可直接输出
  36. '''
  37. # 请在此处添加代码 #
  38. # *************begin************#
  39. for i in range(n):
  40. lockbar.acquire()
  41. print('python',end='')
  42. sys.stdout.flush()
  43. lockpython.release()
  44. time.sleep(0.2)
  45. # **************end*************#
  46. if __name__ == '__main__':
  47. lockfoo = threading.Lock() # 定义3个互斥锁
  48. lockbar = threading.Lock()
  49. lockpython =threading.Lock()
  50. n = int(input())
  51. t1 = threading.Thread(target=showfoo,args=[n]) # 定义3个线程
  52. t2 = threading.Thread(target=showbar,args=[n])
  53. t3 = threading.Thread(target=showpython,args=[n])
  54. lockfoo.acquire() # 先锁住foo,bar锁,保证先打印foo
  55. lockbar.acquire()
  56. t1.start()
  57. t2.start()
  58. t3.start()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/616899
推荐阅读
相关标签
  

闽ICP备14008679号