python写多线程时遇到的问题

发布于 2021-11-27 09:59:58 字数 2396 浏览 853 评论 5

现在有这样一个需求,有一个队列线程一直在等待新的线程的推入,一旦有新的线程推入,它就会不停的轮询队列中所有的线程,并查询这个线程的状态,当这个被轮询的线程状态符合某个标准时,打印一句话,并且将这个状态符合某个标准的线程从队列中移除掉,当队列中没有任何线程时,队列线程会一直等待新线程的推入。要求,这个队列线程在轮询过程中允许新的线程被推入。

只要调用这个线程的程序在跑,那么这个线程类只new一次,调用这个线程的类会不定时的向队列线程中推入新的线程,调用的类把线程推入到这个队列线程中后它就不管了.

队列线程感觉可以用个list,直接把其他的新线程加进来,写个函数对item in list一直跑,找到了就把那个线程从list里拿掉。。。是不是挺简单的感觉。。

理想很性感,实现好骨感。。。。。可惜就实现不了。。。

目前我写的程序如下:

#!encoding:utf-8
import os, sys
import Queue
import threading


# queue = Queue.Queue(0)
class parent:
    link = []

    def __init__(self):
        self.MyThread(self.link).start()

    def addLink(self, pid):
        self.link.append(pid)

    class MyThread(threading.Thread):
        th_link = []

        def __init__(self, link):
            self.th_link = link
            threading.Thread.__init__(self)

        def run(self):
            # current = threading.currentThread()
            # print "当前正在进行的线程为:%sn"%(current.name)
            print len(self.th_link)
            while True:
                if len(self.th_link) > 0:
                    for i in range(0, len(self.th_link) - 1):
                        print  i, self.th_link[i]
                        # query pid status
                        a = utilQu()
                        status = a.pidStatus(pid=self.th_link[i])
                        print "返回的status为:%sn" % (status)
                        if status == "running":
                            print "没有结束"
                        else:
                            print "已经结束"
                            del self.th_link[i]
                else:
                    print "没有线程"
                    self.join()


import random


class utilQu:
    temp = ["running", "running", "running", "running", "running", "running", "running", "running", "running",
            "commplate"]

    def pidStatus(self, pid):
        num = len(self.temp)
        index = random.randint(0, num - 1)
        print "utilQu中获取到的下标为:%s,值为%s" % (index, self.temp[index])
        return self.temp[index]


a = parent()
a.addLink("zhang ruo xuan")
a.addLink("xing ba ke")

在此处想要做的是,在for循环中逐个遍历th_link,查询每个值在utilQu中的返回值,如果返回值为commplate则移除这个值,当th_link为空时,等待传入新值,但是我写的这个程序存在一个问题, 比如像下面的情况,我传入了两个值,但是这个线程就会一直循环查询第一个传入的值,第一个值不结束,就不会去查询第二个值,另一个问题是,当第一个值查询完毕了,程序就结束了,并没有查询第二个值,怎么样才能将这个程序改成我想要的结果?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

猫烠⑼条掵仅有一顆心 2021-12-01 19:10:51

我的博客里有我使用python中间件进行消息传递的文章,你自己找找吧。

韬韬不绝 2021-12-01 18:55:26

有没有python写的消息中间件?

清欢 2021-12-01 16:36:13

自己解决了

高跟鞋的旋律 2021-12-01 01:44:04
#!encoding:utf-8
import Queue
import threading

class parent:
    link = []
    queue = Queue.Queue(0)

    def __init__(self):
        # self.MyThread(self.queue).start()
        pass

    def addLink(self, pid):
        self.queue.put(pid)
        self.MyThread(self.queue).start()

    class MyThread(threading.Thread):
        th_link = []
        th_queue = []

        def __init__(self, queue):
            self.th_queue = queue
            threading.Thread.__init__(self)

        def run(self):
            while True:
                if self.th_queue.qsize() > 0:
                    pid = self.th_queue.get()
                    m = False
                    a = utilQu()
                    while not m:
                        returnType = a.pidStatus(pid=pid)
                        if returnType == "commplate" :
                            print "%s结束了n"%(pid)
                            break
                        else :
                            print "%s运行中....n"%(pid)

                else:
                    self.th_queue.join()

import random
class utilQu:
    temp = ["running", "running", "running", "running", "running", "running", "running", "running", "running",
            "commplate"]

    def pidStatus(self, pid):
        num = len(self.temp)
        index = random.randint(0, num - 1)
        # print "utilQu中获取到的下标为:%s,值为%s" % (index, self.temp[index])
        return self.temp[index]


a = parent()
a.addLink("aaaaaaaaa")
a.addLink("bbbbbbbbb")
a.addLink("ccccccccc")
a.addLink("ddddddddd")
a.addLink("eeeeeeeee")
a.addLink("fffffffff")

归途 2021-11-28 23:27:59

线程池么 threadpool 大法好

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文