Unicorn# 发表于 2020-9-16 00:05:31

multiprocessing无法使用

程序不会进入Process中,命令行运行报错如下:
RuntimeError:
      An attempt has been made to start a new process before the
      current process has finished its bootstrapping phase.

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

            if __name__ == '__main__':
                freeze_support()
                ...

      The "freeze_support()" line can be omitted if the program
      is not going to be frozen to produce an executable.
StackOverFlow上的方案如下(我试了没成功)
stackoverflow
测试代码:
import multiprocessing
import parallelTestModule

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

p1.start()
p2.start()
p3.start()
p4.start()
p1.join()
p2.join()
p3.join()
p4.join()
print('主线程')

疾风怪盗 发表于 2020-9-16 00:23:58

多进程好像有个很大的坑,必须要在if __name__ == '__main__':下运行,否则就报错,所以之前打算用多进程的,结果图形界面上打包也有坑,最后还是用了多线程来做
import multiprocessing
import time
import random


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

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=run, args=('anne',))# 必须加,号
    p2 = multiprocessing.Process(target=run, args=('alice',))
    p3 = multiprocessing.Process(target=run, args=('biantai',))
    p4 = multiprocessing.Process(target=run, args=('haha',))
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    p4.start()
    p4.join()
    print('主线程')

小莫非 发表于 2020-9-16 04:58:46

试试把 start() 方法换成 run()
再不行把 阻塞去了运行一遍
我刚才也遇到了类似的问题{:10_256:}{:10_256:}{:10_256:}

小莫非 发表于 2020-9-16 05:59:08

添加一下,发现进程间的通信似乎用线程才能调用 start() 方法# from multiprocessing import Process
from queue import Queue
from time import sleep
from threading import Thread

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


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


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

    # p1.run()
    # p2.run()

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

    t1.start()
    t2.start()

    t1.join()
    t2.join()


小莫非 发表于 2020-9-16 06:00:25

小莫非 发表于 2020-9-16 05:59
添加一下,发现进程间的通信似乎用线程才能调用 start() 方法

可以尝试跑一边代码我也是看了不下10遍教程才发现这个问题,真的是一看就会,一敲就废

Unicorn# 发表于 2020-9-16 12:55:13

疾风怪盗 发表于 2020-9-16 00:23
多进程好像有个很大的坑,必须要在if __name__ == '__main__':下运行,否则就报错,所以之前打算用多进程的 ...

仍然不行

疾风怪盗 发表于 2020-9-16 12:58:52

本帖最后由 疾风怪盗 于 2020-9-16 13:00 编辑

Unicorn# 发表于 2020-9-16 12:55
仍然不行

我这没问题啊,你的报错提示是什么?

Unicorn# 发表于 2020-9-16 13:29:46

疾风怪盗 发表于 2020-9-16 12:58
我这没问题啊,你的报错提示是什么?

你是mac或者linux吗
只有win才有这个问题

疾风怪盗 发表于 2020-9-16 13:32:06

Unicorn# 发表于 2020-9-16 13:29
你是mac或者linux吗
只有win才有这个问题

win10+python3.8.3

Unicorn# 发表于 2020-9-16 17:03:16

疾风怪盗 发表于 2020-9-16 13:32
win10+python3.8.3

报错上面说了

疾风怪盗 发表于 2020-9-16 17:12:59

Unicorn# 发表于 2020-9-16 17:03
报错上面说了

?在哪里?
你的报错提示是什么?有没有用我2楼回复的代码?
我这里代码运行没问题

Unicorn# 发表于 2020-9-16 17:24:26

疾风怪盗 发表于 2020-9-16 17:12
?在哪里?
你的报错提示是什么?有没有用我2楼回复的代码?
我这里代码运行没问题

不是报错,只是警告(shell运行连警告都没有)
用过你的代码 不行

疾风怪盗 发表于 2020-9-16 17:25:37

Unicorn# 发表于 2020-9-16 17:24
不是报错,只是警告(shell运行连警告都没有)
用过你的代码 不行

{:10_284:}行吧,我这边运行是正常的,没任何问题,说明代码没问题的
页: [1]
查看完整版本: multiprocessing无法使用