头歌Python 课内实验4-1:进程和线程-基础

第1关:求素数的个数

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

import math
from multiprocessing import cpu_count
from multiprocessing import Pool


def isPrime(n):
    # 判断数字是否为素数
    #        请在此处添加代码       #
    # *************begin************#
    if n==1:
        return False
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True
    # **************end*************#




def howMany(T):
    # 计算给定区间含有多少个素数
    #        请在此处添加代码       #
    # *************begin************#
    n=0
    for i in range(T[0],T[1]+1):
        if isPrime(i)==True:
            n=n+1
    return n
    # **************end*************#




def separateNum(N, CPU_COUNT):
    # 对整个数字空间N进行分段CPU_COUNT
    #        请在此处添加代码       #
    # *************begin************#
    x=N//CPU_COUNT
    n=0
    p=[]
    for i in range(CPU_COUNT):#101分4   1-25,26-50,51-75,76-101
        p.append([i*x+1,(i+1)*x])
        
    if p[CPU_COUNT-1][1]<N:
        p[CPU_COUNT-1][1]=N
    return p
    # **************end*************#
    
if __name__ == '__main__':
    N = int(input())
    # 多进程
    CPU_COUNT = cpu_count()  ##CPU内核数 本机为8
    pool = Pool(CPU_COUNT)
    sepList = separateNum(N, CPU_COUNT)
    result = []
    for i in range(CPU_COUNT):
        result.append(pool.apply_async(howMany, (sepList[i], )))
    pool.close()
    pool.join()
    # ans = 0
    list = [res.get() for res in result]
    print(sum(list), end = '')


第2关:求合数的个数。

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

import threading
import math
ans = 0
lock = threading.Lock()


import threading
import math
ans = 0
lock = threading.Lock()


def isPrime(n):
    # 判断数字是否为素数
   
    global ans
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
   



def howMany(T):
    # 计算给定区间含有多少个素数
   

    sum = 0
    for i in range(T[0], T[1] + 1):
        if isPrime(i):
            sum += 1
    lock.acquire()
    try:
        global ans
        ans += sum
    finally:
        lock.release()
   




def seprateNum(N, CPU_COUNT):
    # 对整个数字空间N进行分段CPU_COUNT
    list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
    list[0][0] = 1
    if list[CPU_COUNT - 1][1] < N:
        list[CPU_COUNT - 1][1] = N
    return list

if __name__ == '__main__':
    N = int(input())
    threadNum = 32
 #        请在此处添加代码       #
    # *************begin************#
    sepList = seprateNum(N, threadNum)
    result = []
    for i in range(0,threadNum):
        result.append(threading.Thread(target=howMany,args=(sepList[i],)))
        result[i].start()
    for i in range(0,threadNum):
        result[i].join()
    print(N-ans-1, end = '')
    # **************end*************#

第3关:交替打印foobarpython

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

import threading
import sys
import time


def showfoo(n):
  '''
  
  :param n: 要输出foobarpython的次数
  :return: 无返回,可直接输出
  '''
  # 请在此处添加代码       #
  # *************begin************#
  for i in range(n):
    lockpython.acquire()
    print('foo',end='')
    lockfoo.release()
  # **************end*************#


def showbar(n):
    '''

      :param n: 要输出foobarpython的次数
      :return: 无返回,可直接输出
      '''
    # 请在此处添加代码       #
# *************begin************#
    for i in range(n):
      lockfoo.acquire()
      print('bar',end='')
      lockbar.release()
# **************end*************#

def showpython(n):
    '''

      :param n: 要输出foobarpython的次数
      :return: 无返回,可直接输出
      '''
     # 请在此处添加代码       #
# *************begin************#
    for i in range(n):
      lockbar.acquire()
      print('python',end='')
      lockpython.release()
# **************end*************#


if __name__ == '__main__':
    lockfoo = threading.Lock()  # 定义3个互斥锁
    lockbar = threading.Lock()
    lockpython =threading.Lock()
    n = int(input())
    t1 = threading.Thread(target=showfoo,args=[n])  # 定义3个线程
    t2 = threading.Thread(target=showbar,args=[n])
    t3 = threading.Thread(target=showpython,args=[n])
    lockfoo.acquire()  # 先锁住foo,bar锁,保证先打印foo
    lockbar.acquire()


    t1.start()
    t2.start()
    t3.start()


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值