Python中文
首页
教程
问答
标签
搜索
登录
注册
Python中的多线程技术
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>在python中实现多线程时,我遇到了一些问题。这个问题对于我的用例来说非常具体。在同一个网站上浏览了许多帖子之后,我部署了最广泛建议/使用的方法。你知道吗</p> <p>我从定义线程类开始,如下所示。你知道吗</p> <pre><code>class myThread(Thread): def __init__(self, graphobj, q): Thread.__init__(self) self.graphobj = graphobj self.q = q def run(self): improcess(self.graphobj, self.q) </code></pre> <p>我定义了我的函数来完成所有需要的处理。你知道吗</p> <pre><code>def improcess(graphobj, q): while not exitFlag: queueLock.acquire() if not q.empty(): photo_id = q.get() queueLock.release() # Complete processing else: queueLock.release() </code></pre> <p>现在是我被困住的部分。我能够运行下面提到的代码完全是因为它没有任何问题。但是,如果我尝试将同一个函数包装成这样,它就会崩溃。你知道吗</p> <pre><code>def train_control(graphobj, photo_ids): workQueue = Queue(len(photo_ids)) for i in range(1,5): thread = myThread(graphobj=graphobj, q=workQueue) thread.start() threads.append(thread) queueLock.acquire() for photo_id in photo_ids: workQueue.put(photo_id) queueLock.release() while not workQueue.empty(): pass exitFlag = 1 for t in threads: t.join() </code></pre> <p>我所说的中断是指线程完成了它们的工作,但它们并没有停止等待,即exitFlag从未设置为1。我不知道如何使这项工作。你知道吗</p> <p>不幸的是,我们的系统的设计是这样的,这段代码需要被包装在一个可以被另一个模块调用的函数中,因此将其拉出并不是一个真正的选择。你知道吗</p> <p>期待着专家们的意见。提前谢谢。你知道吗</p> <p>编辑:初稿忘了提这个。我全局初始化exitFlag并将其值设置为0。你知道吗</p> <p>下面是我创建的用于捕获此问题的最小可验证代码段:</p> <pre><code>import threading import Queue globvar01 = 5 globvar02 = 7 exitFlag = 0 globlist = [] threads = [] queueLock = threading.Lock() workQueue = Queue.Queue(16) class myThread(threading.Thread): def __init__(self, threadID, q): threading.Thread.__init__(self) self.threadID = threadID self.q = q def run(self): print "Starting thread " + str(self.threadID) myfunc(self.threadID, self.q) print "Exiting thread " + str(self.threadID) def myfunc(threadID, q): while not exitFlag: queueLock.acquire() if not workQueue.empty(): thoughtnum = q.get() queueLock.release() print "Processing thread " + str(threadID) if (thoughtnum < globvar01): globlist.append([1,2,3]) elif (thoughtnum < globvar02): globlist.append([2,3,4]) else: queueLock.release() def controlfunc(): for i in range(1,5): thread = myThread(i, workQueue) thread.start() threads.append(thread) queueLock.acquire() for i in range(1,11): workQueue.put(i) queueLock.release() # Wait for queue to empty while not workQueue.empty(): pass exitFlag = 1 # Wait for all threads to complete for t in threads: t.join() print "Starting main thread" controlfunc() print "Exiting Main Thread" </code></pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>在生成任何线程之前,您需要确保将<code>exitFlag</code>设置为0(<code>False</code>),否则在<code>impprocess()</code>中它们将不会执行任何操作,并且队列将保持为非空。你知道吗</p> <p>如果将<code>exitFlag</code>作为全局变量,并且没有从上一次运行中清除,则可能会发生此问题。你知道吗</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何添加虚拟方法
8 回答
如何添加表示整数的擦边字符串?
1 回答
如何添加要在Bokeh中使用的新font.ttf文件?
4 回答
如何添加要显示的矩阵XY轴编号和XY轴
9 回答
如何添加计数?
8 回答
如何添加计数器函数?
5 回答
如何添加计数器列来计算数据帧中另一列中的特定值?
2 回答
如何添加计数器来跟踪while循环中的月份和年份?
8 回答
如何添加计数并删除countplot的顶部和右侧脊椎?
7 回答
如何添加计时器wx.应用程序更新窗口对象的主循环?
1 回答
如何添加评论到帖子?PostDetailVew,Django 2.1.5
9 回答
如何添加评论拉梅尔亚姆
6 回答
如何添加诸如矩阵Python/Pandas之类的数据帧?
10 回答
如何添加谷歌地点自动完成到Flask?
6 回答
如何添加超时、python discord bot
3 回答
如何添加超过1dp的检查
9 回答
如何添加距离方法
9 回答
如何添加跟随游戏的敌人精灵
8 回答
如何添加路径以便python可以找到程序?
2 回答
如何添加身份验证/安全性以使用happybase访问HBase?
5 回答