鱼C论坛

 找回密码
 立即注册
查看: 72|回复: 12

multiprocessing无法使用

[复制链接]
最佳答案
14 
发表于 2020-9-16 00:05:31 | 显示全部楼层 |阅读模式
20鱼币
程序不会进入Process中,命令行运行报错如下:
  1. RuntimeError:
  2.         An attempt has been made to start a new process before the
  3.         current process has finished its bootstrapping phase.

  4.         This probably means that you are not using fork to start your
  5.         child processes and you have forgotten to use the proper idiom
  6.         in the main module:

  7.             if __name__ == '__main__':
  8.                 freeze_support()
  9.                 ...

  10.         The "freeze_support()" line can be omitted if the program
  11.         is not going to be frozen to produce an executable.
复制代码

StackOverFlow上的方案如下(我试了没成功)
stackoverflow
测试代码:
  1. import multiprocessing
  2. import parallelTestModule

  3. def run(name):
  4.     print('%s runing' %name)
  5.     time.sleep(random.randrange(1,5))
  6.     print('%s running end' %name)
  7.         
  8.                
  9. p1=multiprocessing.Process(target=run,args=('anne',)) #必须加,号
  10. p2=multiprocessing.Process(target=run,args=('alice',))
  11. p3=multiprocessing.Process(target=run,args=('biantai',))
  12. p4=multiprocessing.Process(target=run,args=('haha',))

  13. p1.start()
  14. p2.start()
  15. p3.start()
  16. p4.start()
  17. p1.join()
  18. p2.join()
  19. p3.join()
  20. p4.join()
  21. print('主线程')
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
205 
发表于 2020-9-16 00:23:58 | 显示全部楼层
多进程好像有个很大的坑,必须要在if __name__ == '__main__':下运行,否则就报错,所以之前打算用多进程的,结果图形界面上打包也有坑,最后还是用了多线程来做
  1. import multiprocessing
  2. import time
  3. import random


  4. def run(name):
  5.     print('%s runing' % name)
  6.     time.sleep(random.randrange(1, 5))
  7.     print('%s running end' % name)

  8. if __name__ == '__main__':
  9.     p1 = multiprocessing.Process(target=run, args=('anne',))  # 必须加,号
  10.     p2 = multiprocessing.Process(target=run, args=('alice',))
  11.     p3 = multiprocessing.Process(target=run, args=('biantai',))
  12.     p4 = multiprocessing.Process(target=run, args=('haha',))
  13.     p1.start()
  14.     p1.join()
  15.     p2.start()
  16.     p2.join()
  17.     p3.start()
  18.     p3.join()
  19.     p4.start()
  20.     p4.join()
  21.     print('主线程')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
5 
发表于 2020-9-16 04:58:46 | 显示全部楼层
试试把 start() 方法换成 run()
再不行把 阻塞去了运行一遍
我刚才也遇到了类似的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
5 
发表于 2020-9-16 05:59:08 | 显示全部楼层
添加一下,发现进程间的通信似乎用线程才能调用 start() 方法
  1. # from multiprocessing import Process
  2. from queue import Queue
  3. from time import sleep
  4. from threading import Thread

  5. def download(q):
  6.     images = ["girl.png", "boy.png", "man.png"]
  7.     for image in images:
  8.         print("开始下载图片:{}".format(image))
  9.         sleep(0.5)
  10.         q.put(image)


  11. def getfile(q):
  12.     while True:
  13.         try:
  14.             file = q.get(timeout=2)
  15.             print("图片:{} 下载成功...".format(file))
  16.         except:
  17.             break


  18. if __name__ == '__main__':
  19.     q = Queue(5)
  20.     # p1 = Process(target=download, args=(q,))
  21.     # p2 = Process(target=getfile, args=(q,))

  22.     # p1.run()
  23.     # p2.run()

  24.     t1 = Thread(target=download, args=(q,))
  25.     t2 = Thread(target=getfile, args=(q,))

  26.     t1.start()
  27.     t2.start()

  28.     t1.join()
  29.     t2.join()


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
5 
发表于 2020-9-16 06:00:25 | 显示全部楼层
小莫非 发表于 2020-9-16 05:59
添加一下,发现进程间的通信似乎用线程才能调用 start() 方法

可以尝试跑一边代码  我也是看了不下10遍教程才发现这个问题,真的是一看就会,一敲就废
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
14 
 楼主| 发表于 2020-9-16 12:55:13 | 显示全部楼层
疾风怪盗 发表于 2020-9-16 00:23
多进程好像有个很大的坑,必须要在if __name__ == '__main__':下运行,否则就报错,所以之前打算用多进程的 ...

仍然不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
205 
发表于 2020-9-16 12:58:52 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-16 13:00 编辑


我这没问题啊,你的报错提示是什么?
屏幕截图 2020-09-16 125820.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
14 
 楼主| 发表于 2020-9-16 13:29:46 | 显示全部楼层
疾风怪盗 发表于 2020-9-16 12:58
我这没问题啊,你的报错提示是什么?

你是mac或者linux吗
只有win才有这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
205 
发表于 2020-9-16 13:32:06 | 显示全部楼层
Unicorn# 发表于 2020-9-16 13:29
你是mac或者linux吗
只有win才有这个问题

win10+python3.8.3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
14 
 楼主| 发表于 2020-9-16 17:03:16 From FishC Mobile | 显示全部楼层
疾风怪盗 发表于 2020-9-16 13:32
win10+python3.8.3

报错上面说了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
205 
发表于 2020-9-16 17:12:59 | 显示全部楼层


?在哪里?
你的报错提示是什么?有没有用我2楼回复的代码?
我这里代码运行没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
14 
 楼主| 发表于 2020-9-16 17:24:26 From FishC Mobile | 显示全部楼层
疾风怪盗 发表于 2020-9-16 17:12
?在哪里?
你的报错提示是什么?有没有用我2楼回复的代码?
我这里代码运行没问题

不是报错,只是警告(shell运行连警告都没有)
用过你的代码 不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
205 
发表于 2020-9-16 17:25:37 | 显示全部楼层
Unicorn# 发表于 2020-9-16 17:24
不是报错,只是警告(shell运行连警告都没有)
用过你的代码 不行

行吧,我这边运行是正常的,没任何问题,说明代码没问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-9-30 22:55

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表