Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理-如何实现共享计数器和队列_Python_Python 3.x_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python多处理-如何实现共享计数器和队列

Python多处理-如何实现共享计数器和队列,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,我有以下Python3代码: from multiprocessing import Process, JoinableQueue, Value from multiprocessing.managers import SyncManager def test(): global numfail global queue while not queue.empty(): number = queue.get() with numfail.

我有以下Python3代码:

from multiprocessing import Process, JoinableQueue, Value
from multiprocessing.managers import SyncManager

def test():
    global numfail
    global queue
    while not queue.empty():
        number = queue.get()
        with numfail.get_lock():
            numfail.value += number
        queue.task_done()

def startthreads():
    global numfail
    global queue
    queue = JoinableQueue()
    for i in range(100):
        numfail = Value('i',0)
        for j in range(10):
            queue.put(j)
        for j in range(10):
            Process(target=test, args=[]).start()

        queue.join()
        print(i, numfail.value)

numfail = 0
startthreads()
每次的输出应该是45,但是有时一些值不能加到和中,有时会出现死锁

我还与一位经理一起尝试过:

from multiprocessing import Process, JoinableQueue, Value
from multiprocessing.managers import SyncManager

def test():
    global numfail
    global queue
    while not queue.empty():
        number = queue.get()
        numfail.value += number
        queue.task_done()

def startthreads():
    global numfail
    global queue
    queue = JoinableQueue()
    manager = SyncManager()
    manager.start()
    for i in range(100):
        numfail = manager.Value('i',0)
        for j in range(10):
            queue.put(j)
        for j in range(10):
            Process(target=test, args=[]).start()

        queue.join()
        print(i, numfail.value)

numfail = 0
startthreads()
但是我得到了下面的错误

Process Process-281:
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "MT.py", line 9, in test
    numfail.value += number
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 1154, in get
    return self._callmethod('get')
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 850, in _callmethod
    raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 250, in serve_client
    self.id_to_local_proxy_obj[ident]
KeyError: '7f8da01ff310'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 252, in serve_client
    raise ke
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 246, in serve_client
    obj, exposed, gettypeid = id_to_obj[ident]
KeyError: '7f8da01ff310'
---------------------------------------------------------------------------
Process Process-280:
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "MT.py", line 9, in test
    numfail.value += number
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 1154, in get
    return self._callmethod('get')
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 850, in _callmethod
    raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 250, in serve_client
    self.id_to_local_proxy_obj[ident]
KeyError: '7f8da01ff310'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 252, in serve_client
    raise ke
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 246, in serve_client
    obj, exposed, gettypeid = id_to_obj[ident]
KeyError: '7f8da01ff310'
---------------------------------------------------------------------------
Process Process-275:
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "MT.py", line 9, in test
    numfail.value += number
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 1154, in get
    return self._callmethod('get')
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 850, in _callmethod
    raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 250, in serve_client
    self.id_to_local_proxy_obj[ident]
KeyError: '7f8da01ff310'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 252, in serve_client
    raise ke
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 246, in serve_client
    obj, exposed, gettypeid = id_to_obj[ident]
KeyError: '7f8da01ff310'
---------------------------------------------------------------------------

如何解决问题,或者如何以另一种方式实现,以便将队列中的“任务”发送给另一个函数,让该函数处理所有项,并为每个项增加一个变量。

去掉全局变量,将它们作为参数传递给子进程

此外,您还可以将SyncManager代理用于队列:

queue = manager.Queue()
也可以考虑使用游泳池