• 聂小倩
    2021-04-10
    老师,请问为什么说“在多进程的程序中,不能采用标准数据类型来传递数据”呢?

    作者回复: 这里要涉及操作系统的一些知识,一个Python进程运行之后,会申请自己运行所需要的内存,内存又按照功能分成很多部分,其中的“栈”会存放基本数据类型。那么一个进程中进行变量赋值是需要“栈”这个功能来完成的。 那当你使用了多进程之后,就会产生另一个进程,也就是会申请另一组“栈”。那么两个进程用了两个不同的“栈”,所以无法使用赋值的方式传递变量,而两个进程又可能会有互相通信的需要,所以在设计进程的时候,会再设计进程之间的通信方式,其中管道就是最常用的通信方式之一了。

    
    6
  • 十一哈哈
    2021-03-08
    windows下使用multiprocessing,要将进程池相关代码应该放在if __name__ == '__main__'下面,要不然运行会报错....

    作者回复: 是的,感谢,忘记在文字下方提醒大家。

    共 2 条评论
    6
  • Geek_a345af
    2022-01-19
    把您的代码复制到我电脑上试了下, 1、发现100以内的求平方,我这边的结果并没有启用多进程,一个进程就做完了这些。改成求1000的内的平方,才创建了两个进程。(电脑cpu是8) 2、queue.put(os.getpid())向队列里添加进程的id,在后面向set里存这些id的时候,发现queue是空的,不太明白是为什么。

    作者回复: 你好,第一个问题,和你怀疑的cpu压力大小和进程数量多少是有一定关系的,基于硬件配置高,没有创建多进程是有可能出现的 2 queue.put(os.getpid()) 之后如果没有报错或没有取出数据之前队列中的数据是不会消失的,建议你这样做: 执行了queue.put(os.getpid()) 之后,增加一个观察队列的代码 ,queue.qsize() 这行代码可以返回队列的大小(队列里元素的数量) 另外在执行过程中,观察一下运行的终端是否有错误产生。

    
    1
  • 天国之影
    2021-12-08
    老师,我运行出来的时间统计结果如下: 并行计算时间统计: 0.1607363224029541 串行计算时间统计: 0.0009999275207519531 为什么并行计算比串行计算耗时还长?

    作者回复: 从执行结果来看,串行和并行不是一个数量级的速度。所以我猜测你的串行计算程序一定是执行了多次。为什么多次执行相同的程序会变“快”?相信你看到这里心里就有了对正确答案的猜测。没错,这里的串行程序并没有计算,而是由于Python解释器在内存中缓存了短时间多次执行程序的结果。 那么由此,你可能会衍生出另外一个问题:既然能缓存了,跑在生成环境中的代码也可以,那么是不是并行计算无法比串行计算更有优势? 这里一定要清楚,我们跑的测试代码,是两次执行过程的中间结果和最终结果都没有变化,且代码简单才能进行的缓存。一旦进行复杂的常见,中间过程和结果不同,计算过程也就无法缓存了,必然并行和串行都要当做第一次运行来对待。这也经常是我们听到很多编译型语言在吐槽python运行的慢的原因了。 关于python执行代码缓存相关问题,可以参考下面这个链接,得到更详细的解释: https://www.jianshu.com/p/eb100c7bb4cf

    
    
  • Bill
    2021-10-20
    打卡

    编辑回复: 棒!

    
    
  • Soul of the Drago...
    2021-03-06
    老师,请问如果在代码运行过程中出现“UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-19: ordinal not in range(128)” 这样的报错,应该如何解决呢?

    作者回复: 你的Python应该是python2.x版本,需要将它换成Python3版本,要从官方网站重新下载。

    
    
  • 天国之影
    2021-12-08
    如果在Jupyter Notebook下,可使用以下方法: 通过临时文件方式,读取并使用并行计算 from multiprocessing import Pool from functools import partial import inspect def parallal_task(func, iterable, cpu_count = 4): with open(f'./tmp_func.py', 'w') as file: file.write(inspect.getsource(func).replace(func.__name__, "task")) from tmp_func import task if __name__ == '__main__': func = partial(task) pool = Pool(cpu_count * 2) res = pool.map(func, iterable) pool.close() return res else: raise "Not in Jupyter Notebook" # 计算平方 def def_f(x): return x * x for res in parallal_task(def_f, range(1, 101)): print(f'计算平方的结果是:{res}')
    展开
    
    1
  • ifelse
    2023-07-09 来自浙江
    学习打卡
    
    
  • 坚果
    2022-03-27
    这一章有没有windows并行计算参考资料,我一个程序都没有调试成功,一运行就堵塞
    
    
  • 坚果
    2022-03-27
    通过临时文件方式,读取并使用并行计算,为什么要通过临时文件使用并行计算?
    
    