赞
踩
这段时间在进行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创建工程时默认使用的是虚拟环境,而脚本在执行时也用的虚拟环境。导致的该问题。只需要切换运行配置就可以正常运行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。