当前位置:   article > 正文

python虚拟环境下多进程用queue提示PermissionError: [WinError 5]和put卡住的问题_queue 满了 put 卡死

queue 满了 put 卡死

关于在PyCharm中使用multiprocessing.Queue遇到的坑

python虚拟环境下使用Queue进行进程通信遇到的问题

这段时间在进行multiprocessing多进程的学习,在多线程通信时用PyCharm的虚拟环境,遇到了一个坑,特此记录一下,方便其他小伙伴解决问题。
直接上代码:

import multiprocessing
from multiprocessing import Queue

from multiprocessing import Process
import time
import ctypes
import sys
import os
import traceback


class CMyProcessQueuePut(Process):
    def __init__(self, my_queue):
        super(CMyProcessQueuePut, self).__init__()
        self.my_queue = my_queue

    def run(self):
        index = 0
        while True:
            self.my_queue.put("the index is:{0}".format(index), timeout=1)
            # print(self.my_queue.qsize())
            time.sleep(1)
            index += 1


class CMyProcessQueueGet(Process):
    def __init__(self, my_queue):
        super(CMyProcessQueueGet, self).__init__()
        self.my_queue = my_queue

    def run(self):
        while True:
            if not self.my_queue.empty():
                # print(self.my_queue.qsize)
                try:
                    data = self.my_queue.get(timeout=0.5)

                    print(data)
                except:
                    print(traceback.format_exc())
            time.sleep(1)


if __name__ == '__main__':
    # ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, sys.argv[0], None, 1)
    multiprocessing.freeze_support()
    multiprocessing.set_start_method('spawn')
    my_queue = Queue(500)

    my_thread_put = CMyProcessQueuePut(my_queue)
    my_thread_put.start()

    my_thread_get = CMyProcessQueueGet(my_queue)
    my_thread_get.start()

    print("process put pid is:", my_thread_put.pid)
    print("process get pid is:", my_thread_get.pid)
    print(my_queue.qsize())

    time.sleep(60)
    print("run finish.")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

以上代码实现两个进程通信,一个进程负责put,一个进程负责get。当在Python虚拟环境或者PyCharm虚拟环境下执行时提示如下错误:PermissionError: [WinError 5] 拒绝访问。

并且还遇到Queue这put的时候一直卡住。后来通过设置timeout=1报错信息如下:

Traceback (most recent call last):
  File "C:\Python37\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
  File "C:\Users\admin\PycharmProjects\first_qt\Code\Logic\myProcessQueue.py", line 32, in run
    self.my_queue.put("the index is:{0}".format(index), timeout=1)
  File "C:\Python37\lib\multiprocessing\queues.py", line 83, in put
    raise Full
queue.Full
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
此时通过queue.qsize()查看显示的是500 
  • 1

后来在另外一个计算机上部署相同的代码执行成功,后来经过对比发现两处运行环境的区别。
最终问题原因是由于在PyCharm创建工程时默认使用的是虚拟环境,而脚本在执行时也用的虚拟环境。导致的该问题。只需要切换运行配置就可以正常运行了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/189716
推荐阅读
相关标签
  

闽ICP备14008679号