python 底层原理processpoolexecutor_理解Python的PoolExecutor

Demo代码和引用知识点都参考自《理解Python并发编程一篇就够了|PoolExecutor篇》--董伟明或作者个人公众号Python之美, 《Python Cookbook》和Python并发编程之线程池/进程池。

ThreadPoolExecutor 和ProcessPoolExecutor分别对threading和multiprocessing进行了高级抽象,暴露出简单的统一接口。

通过ProcessPoolExecutor 来做示例。

主要提供两个方法map() 和submit()。

map() 方法主要用来针对简化执行相同的方法,如下例:

# -*- coding: utf-8 -*-

from concurrent.futures import ProcessPoolExecutor

def fib(n, test_arg):

if n > 30:

raise Exception('can not > 30, now %s' % n)

if n <= 2:

return 1

return fib(n-1, test_arg) + fib(n-2, test_arg)

def use_map():

nums = [random.randint(0, 33) for _ in range(0, 10)]

with ProcessPoolExecutor() as executor:

try:

results = executor.map(fib, nums, nums)

for num, result in zip(nums, results):

print('fib(%s) result is %s.' % (num, result))

except Exception as e:

print(e)

执行上例,输出如下,当num为30时抛出异常捕获后程序停止运行。

...

fib(19) result is 4181.

fib(11) result is 89.

fib(2) result is 1.

fib(5) result is 5.

fib(24) result is 46368.

fib(2) result is 1.

can not > 30, now 33

使用submit()方法。

# -*- coding: utf-8 -*-

from concurrent.futures import ProcessPoolExecutor, as_completed

import random

def fib(n, test_arg):

if n > 30:

raise Exception('can not > 30, now %s' % n)

if n <= 2:

return 1

return fib(n-1, test_arg) + fib(n-2, test_arg)

def use_submit():

nums = [random.randint(0, 33) for _ in range(0, 10)]

with ProcessPoolExecutor() as executor:

futures = {executor.submit(fib, n, n): n for n in nums}

for f in as_completed(futures):

try:

print('fib(%s) result is %s.' % (futures[f], f.result()))

except Exception

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#define MAX_PROCESS_NUM 10 typedef enum{ READY, RUNNING, BLOCKED } ProcessState; typedef struct{ int pid; ProcessState state; int priority; int remain_time_slice; } PCB; PCB processes[MAX_PROCESS_NUM]; int process_num = 0; #define TIME_SLICE 3 void time_slice_scheduling(){ int i; do{ for(i = 0; i < process_num; i++){ if(processes[i].state == RUNNING){ processes[i].remain_time_slice--; if(processes[i].remain_time_slice == 0){ processes[i].state = READY; } } if(processes[i].state == READY){ processes[i].state = RUNNING; processes[i].remain_time_slice = TIME_SLICE; } } }while(1); } void priority_scheduling(){ int i, j, max_priority, max_index; do{ max_priority = -1; max_index = -1; for(i = 0; i < process_num; i++){ if(processes[i].state == READY && processes[i].priority > max_priority){ max_priority = processes[i].priority; max_index = i; } } if(max_index != -1){ processes[max_index].state = RUNNING; for(j = 0; j < process_num; j++){ if(j != max_index && processes[j].state != BLOCKED){ processes[j].state = READY; } } } }while(1); } #include <stdio.h> int main(){ // 创建进程并初始化 processes[0].pid = 0; processes[0].state = RUNNING; processes[0].priority = 2; processes[0].remain_time_slice = TIME_SLICE; processes[1].pid = 1; processes[1].state = READY; processes[1].priority = 1; processes[1].remain_time_slice = 0; processes[2].pid = 2; processes[2].state = READY; processes[2].priority = 3; processes[2].remain_time_slice = 0; process_num = 3; // 调用时间片轮转调度算法 time_slice_scheduling(); // 调用静态优先级调度算法 priority_scheduling(); return 0; }代码运行错误,请修改
06-06
这段代码存在两个死循环,分别在 time_slice_scheduling() 和 priority_scheduling() 函数中。这会导致程序无法正常退出,需要在循环中添加退出条件。另外,在 priority_scheduling() 函数中,当没有就绪进程时,应该等待新的进程到来,而不是一直循环。修改后的代码如下: ``` #include <stdio.h> #define MAX_PROCESS_NUM 10 #define TIME_SLICE 3 typedef enum { READY, RUNNING, BLOCKED } ProcessState; typedef struct { int pid; ProcessState state; int priority; int remain_time_slice; } PCB; PCB processes[MAX_PROCESS_NUM]; int process_num = 0; void time_slice_scheduling() { int i; do { int all_blocked = 1; for (i = 0; i < process_num; i++) { if (processes[i].state == RUNNING) { processes[i].remain_time_slice--; if (processes[i].remain_time_slice == 0) { processes[i].state = READY; } else { all_blocked = 0; } } if (processes[i].state == READY) { processes[i].state = RUNNING; processes[i].remain_time_slice = TIME_SLICE; all_blocked = 0; } } if (all_blocked) { break; } } while (1); } void priority_scheduling() { int i, j, max_priority, max_index; do { int all_blocked = 1; max_priority = -1; max_index = -1; for (i = 0; i < process_num; i++) { if (processes[i].state == READY && processes[i].priority > max_priority) { max_priority = processes[i].priority; max_index = i; all_blocked = 0; } } if (!all_blocked) { processes[max_index].state = RUNNING; for (j = 0; j < process_num; j++) { if (j != max_index && processes[j].state != BLOCKED) { processes[j].state = READY; } } } else { break; } } while (1); } int main() { // 创建进程并初始化 processes[0].pid = 0; processes[0].state = RUNNING; processes[0].priority = 2; processes[0].remain_time_slice = TIME_SLICE; processes[1].pid = 1; processes[1].state = READY; processes[1].priority = 1; processes[1].remain_time_slice = 0; processes[2].pid = 2; processes[2].state = READY; processes[2].priority = 3; processes[2].remain_time_slice = 0; process_num = 3; // 调用时间片轮转调度算法 time_slice_scheduling(); // 调用静态优先级调度算法 priority_scheduling(); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值