关于在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创建工程时默认使用的是虚拟环境,而脚本在执行时也用的虚拟环境。导致的该问题。只需要切换运行配置就可以正常运行了。