Python 多线程 掷骰子 问题。(萌新)

2018-04-22 21:50:36 +08:00
 xzc19970719
import random
from pygal import Bar
from multiprocessing import Process, Manager,freeze_support


class 骰子类():
def __init__(self, 骰子面数=6):
self.骰子面数 = 骰子面数

def 掷骰子结果方法(self):
return random.randint(1,self.骰子面数)


骰子实例 = 骰子类()
结果列表 = Manager().list()
def 掷骰子函数(次数):
for 投掷次数 in range(次数):
结果列表.append(骰子实例.掷骰子结果方法())

#掷骰子函数(100)
if __name__ == '__main__':
freeze_support()
骰子进程批量 = Pool(10)
for i in range(11):
骰子进程批量.apply_async(掷骰子函数,args=(100,))
骰子进程批量.close()
骰子进程批量.join()
print(结果列表)
每面出现次数字典 = Counter(结果列表)
print(每面出现次数字典)

报错
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\Python\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "D:\Python\lib\multiprocessing\spawn.py", line 114, in _main
prepare(preparation_data)
File "D:\Python\lib\multiprocessing\spawn.py", line 225, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "D:\Python\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path
run_name="__mp_main__")
File "D:\Python\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "D:\Python\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "D:\Python\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "E:\python 笔记\测试.py", line 15, in <module>
结果列表 = Manager().list()
File "D:\Python\lib\multiprocessing\context.py", line 56, in Manager
m.start()
File "D:\Python\lib\multiprocessing\managers.py", line 513, in start
self._process.start()
File "D:\Python\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "D:\Python\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "D:\Python\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
prep_data = spawn.get_preparation_data(process_obj._name)
File "D:\Python\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
_check_not_importing_main()
File "D:\Python\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
is not going to be frozen to produce an executable.''')
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.


emmm 环境在 windows 下。
3509 次点击
所在节点    Python
10 条回复
xzc19970719
2018-04-22 21:51:07 +08:00
英语差。。中文变量名见谅
wwqgtxx
2018-04-23 00:52:07 +08:00
你那是多进程不是多线程
JamesMackerel
2018-04-23 08:43:02 +08:00
为啥不去学易语言,那么牛逼,还能做黑产,做东西飞快。
twotiger
2018-04-23 10:58:57 +08:00
linux 下没问题,你可以试试把你的全局变量
骰子实例 = 骰子类()
结果列表 = Manager().list()
放到 最下面的 if __name__ == '__main__': 试试
xzc19970719
2018-04-23 11:16:57 +08:00
@twotiger 嗯。。Windows 下要还要传递参数。。。呜呜
xzc19970719
2018-04-23 11:17:44 +08:00
@JamesMackerel 😒就这么嫌弃中文变量名嘛
xzc19970719
2018-04-23 11:22:27 +08:00
@JamesMackerel 刚学编程。。也不求什么效率 自己能一眼看懂就行😒
chesterzzy
2018-04-23 12:54:13 +08:00
multiprocessing 在 windows 和 linux 上的表现不同。具体去看看文档吧
另外第一次见 Python 里的中文变量名,长见识(没有贬低的意思,就是觉得挺好玩)
xzc19970719
2018-04-23 16:20:46 +08:00
@chesterzzy 好的 谢谢大佬(≧ω≦)
JamesMackerel
2018-04-24 00:33:37 +08:00
@xzc19970719 没啊。我就是表达我的真实想法而已。易语言真的牛逼。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/448951

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX