gpt4 book ai didi

python - Python多处理过程中的错误

转载 作者:行者123 更新时间:2023-12-04 19:32:37 26 4
gpt4 key购买 nike

我正在尝试编写一个具有多个进程的python代码,其结构和流程是这样的:

import multiprocessing
import ctypes
import time
import errno
m=multiprocessing.Manager()
mylist=m.list()
var1=m.Value('i',0)
var2=m.Value('i',1)
var3=m.Value('i',2)
var4=m.Value(ctypes.c_char_p,"a")
var5=m.Value(ctypes.c_char_p,"b")
var6=3
var7=4
var8=5
var9=6
var10=7
def func(var1,var2,var4,var5,mylist):
i=0
try:
if var1.value==0:
print var2.value,var4.value,var5.value
mylist.append(time.time())
elif var1.value==1:
i=i+2
print var2.value+2,var4.value,var5.value
mylist.append(time.time())
except IOError as e:
if e.errno==errno.EPIPE:
var3.value=var3.value+1
print "Error"
def work():
for i in range(var3.value):
print i,var6,var7,va8,var9,var10
p=multiprocessing.Process(target=func,args=(var1,var2,var4,var5,mylist))
p.start()
work()

当我运行此代码时,有时它可以完美运行,有时它无法运行确切数量的循环计数,有时我会收到以下错误:
0
1
Process Process-2:
Traceback (most recent call last):
File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
self.run()
File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "dummy.py", line 19, in func
if var1.value==0:
File "/usr/lib64/python2.6/multiprocessing/managers.py", line 1005, in get
return self._callmethod('get')
File "/usr/lib64/python2.6/multiprocessing/managers.py", line 722, in _callmethod
self._connect()
File "/usr/lib64/python2.6/multiprocessing/managers.py", line 709, in _connect
conn = self._Client(self._token.address, authkey=self._authkey)
File "/usr/lib64/python2.6/multiprocessing/connection.py", line 149, in Client
answer_challenge(c, authkey)
File "/usr/lib64/python2.6/multiprocessing/connection.py", line 383, in answer_challenge
message = connection.recv_bytes(256) # reject large message
EOFError

这个错误是什么意思?我在这里做错了什么?这个错误说明了什么?请引导我走向正确的道路。我正在使用 CentOS 6.5

最佳答案

在多处理中使用共享变量很棘手。由于 python 全局解释器锁 (GIL),在 Python 中不能直接进行多处理。当您使用 multiprocessing模块,您可以在不同的进程上启动多个任务,但您不能共享内存。
在你的情况下,你需要这个,所以你尝试使用共享内存。但是这里发生的是你有几个进程试图同时读取相同的内存。为了避免内存损坏,进程锁定它当前正在读取的内存地址,禁止其他进程访问它,直到它完成读取。
这里有 3 个进程试图评估 var1.value在第一个 if您的 func 的循环: 第一个进程读取值,另一个被阻塞,引发错误。
为避免这种机制,您应该始终管理 Lock您自己的共享变量。
您可以尝试使用语法:

var1=multiprocessing.Value('i',0) # create shared variable
var1.acquire() # get the lock : it will wait until lock is available
var1.value # read the value
var1.release() # release the lock

外部文件:

锁: https://docs.python.org/2/librar/multiprocessing.html#synchronization-between-processes
吉尔: https://docs.python.org/2/glossary.html#term-global-interpreter-lock

关于python - Python多处理过程中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com