Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程:如何创建并发对象_Python_Multithreading - Fatal编程技术网

Python线程:如何创建并发对象

Python线程:如何创建并发对象,python,multithreading,Python,Multithreading,我正在尝试学习如何使用Python线程,有人能帮我解决这个令人困惑的部分吗 让我们来考虑这个例子;假设一家公司有3组工人,他们正在完成任务。我们希望以优化选择的方式影响这些群体的任务 我尝试为工作组构建线程对象,因此他们 class GroupOfWokers: def __init__(self, n, q,c): self.name= n self.q= 0 # number of tasks that we can do // self.q=Queu

我正在尝试学习如何使用Python线程,有人能帮我解决这个令人困惑的部分吗

让我们来考虑这个例子;假设一家公司有3组工人,他们正在完成任务。我们希望以优化选择的方式影响这些群体的任务

我尝试为工作组构建线程对象,因此他们

class GroupOfWokers:
    def __init__(self, n, q,c):
        self.name= n
        self.q= 0 # number of tasks that we can do // self.q=Queue()
        self.capacity= c

    def giveTask(self):
        #for the second suggestion self.q.put(i)
        if self.q<self.capacity: 
          self.q+=1
          return true
        else:
          return false

    def tasks(self):
       # how many tasks are you working on 
        return self.q
现在,我需要知道如何使它们以并行方式工作

  • 我怎样才能让每个人都在一个线程上工作
  • 如何在这些线程之间创建共享变量?(在本例中,整个团队正在处理多少任务,可以通过使用tasks()提取值后对组任务求和来完成,但我需要了解不同线程之间共享变量的过程)
  • 我应该何时使用queue()以及何时不使用。如果
    self.q=0#我们可以执行的任务数//self.q=Queue()
    我应该使用增量变量还是使用Queue()。好处是什么
      这种混淆可能是由于当前的设计

      您可能需要的是一个扩展类的
      Worker
      类,该类具有一个方法(允许您在每个实例上使用该方法来启动它)和一个它们都从中使用的实例

      编辑-以下是一个简单的示例:

      from threading import Thread
      from Queue import Queue
      
      NUMBER_OF_WORKERS = 10
      NUMBER_OF_TASKS = 1000
      
      # create tasks
      tasks = ['task %d' % i for i in range(NUMBER_OF_TASKS)]
      
      class Worker(Thread):
      
          def __init__(self, name, queue):
              super(Worker, self).__init__()
              self.task_queue = queue
              self.name = name
      
          def run(self):
              while True:
                  task = self.task_queue.get()
                  if not task == "stop":
                      print "%s working on %s" % (self.name, task)
                  else:
                      print "%s is stopping" % self.name
                      break
      
      if "__main__" == __name__:
      
          queue = Queue()
      
          workers = [Worker("Worker %d" % i, queue) for i in range(NUMBER_OF_WORKERS)]
      
          for task in tasks:
              # put tasks in queue
              queue.put(task)
      
          for worker in workers:
              # start workers
              worker.start()
      
          for worker in workers:
              # stop workers
              queue.put("stop")
      
          for worker in workers:
              # wait for workers
              worker.join()
      

      你能展示一些基于给定例子的代码吗。我不明白你到底是什么意思?太好了!整洁的代码。queue=queue()是一个共享变量(类似于共享池),因此self.task\u queue.get()可以从中获取任务。为什么要使用worker.join()等待?
      Thread.join
      是标准的方式,用于反映您正在等待线程在继续之前结束运行。既然我们已经扩展了它,我们就有了
      Thread
      提供的一切,那么为什么不使用它呢?最后一个问题,它是否可以影响特定的任务(比如中间的任务),或者queue()是队列概念的实现,后进先出。把它想象成一篮子任务集,我根据任务的引用将任务分配给工人(我根据任务的重要性和长度对任务进行优先级排序)。我并不是要求实现,如果这是可行的或不可行的,我会提供一个指南,以防我需要深入研究其他事情或不去看一看,而且,如果你有一个可变对象作为任务,你可以改变它的状态。如果它是不可变的,您可能希望结果队列也报告新创建的结果,或者其他一些共享对象。
      from threading import Thread
      from Queue import Queue
      
      NUMBER_OF_WORKERS = 10
      NUMBER_OF_TASKS = 1000
      
      # create tasks
      tasks = ['task %d' % i for i in range(NUMBER_OF_TASKS)]
      
      class Worker(Thread):
      
          def __init__(self, name, queue):
              super(Worker, self).__init__()
              self.task_queue = queue
              self.name = name
      
          def run(self):
              while True:
                  task = self.task_queue.get()
                  if not task == "stop":
                      print "%s working on %s" % (self.name, task)
                  else:
                      print "%s is stopping" % self.name
                      break
      
      if "__main__" == __name__:
      
          queue = Queue()
      
          workers = [Worker("Worker %d" % i, queue) for i in range(NUMBER_OF_WORKERS)]
      
          for task in tasks:
              # put tasks in queue
              queue.put(task)
      
          for worker in workers:
              # start workers
              worker.start()
      
          for worker in workers:
              # stop workers
              queue.put("stop")
      
          for worker in workers:
              # wait for workers
              worker.join()