Educoder中Python--进程和线程

11 篇文章 28 订阅 ¥9.90 ¥99.00
这篇博客探讨了Python中的多进程和多线程技术,通过实例代码展示了如何利用Python计算素数个数和合数个数,同时讲解了ThreadLocal变量的使用。此外,还对比了进程与线程的区别,并涉及到了分布式进程的概念。
摘要由CSDN通过智能技术生成

Python多进程-求素数个数

num.py

import math
from multiprocessing import cpu_count
from multiprocessing import Pool
# 判断数字是否为质数
#********** Begin *********#
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
#********** End *********#
# 计算给定区间含有多少个质数
#********** Begin *********#
def howMany(T):
    sum = 0;
    for i in range(T[0], T[1] + 1):
        if isPrime(i):
            sum += 1
    return sum
#********** End *********#
# 对整个数字空间N进行分段CPU_COUNT
#********** Begin *********#
def separateNum(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
#********** 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 = '')

Python多线程-求合数个数

num2.py

import threading
import math
ans = 0
lock = threading.Lock()
# 判断数字是否为质数
#********** Begin *********#
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
#********** End *********#
#********** Begin *********#
# 计算给定区间含有多少个质数
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()
#********** End *********#
#********** Begin *********#
# 对整个数字空间N进行分段CPU_COUNT
def seprateNum(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
#********** End *********#
if __name__ == '__main__':
    N = int(input())
    threadNum = 32
    t = []
    sepList = seprateNum(N, threadNum)
    for i in range(0, threadNum):
        t.append(threading.Thread(target = howMany, args = (sepList[i], )))
        t[i].start()
    for i in range(0, threadNum):
        t[i].join()
    print(N - 1 - ans, end = '')

 

Python-ThreadLocal变量

threadlocal.py

import threading
x = 10
data = threading.local()
def action():
    global x
    data.num = x
    for i in range(1000000):
        data.num += 1
        data.num -= 1
    x = data.num
x = int(input())
thread = []
for i in range(10):
    thread.append(threading.Thread(target = action))
    thread[i].start()
for i in range(10):
    thread[i].join()
print(x, end = '')

Python-进程 VS 线程

num4.py

import math
from multiprocessing import cpu_count
from multiprocessing import Pool
# 判断数字是否为质数
N = int(input())
a = list(map(int, input().split()))
def howMany(T):
    ans = 0;
    for i in range(T[0] - 1, T[1]):
        ans = max(ans, a[i])
    return ans
# 对整个数字空间N进行分段CPU_COUNT
def seprateNum(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__':
    # 多进程
    #********** Begin *********#
    CPU_COUNT = cpu_count()  ##CPU内核数 本机为8
    pool = Pool(CPU_COUNT)
    sepList = seprateNum(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(max(list), end = '')
    #********** End *********#

 

Python-分布式进程

第1题答案:B

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值