python虚拟环境下多进程用queue提示PermissionError: [WinError 5]和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.")

以上代码实现两个进程通信,一个进程负责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
此时通过queue.qsize()查看显示的是500 

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值