как поместить функцию и аргументы в очередь Python?

 for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject row = jsonArray.getJSONObject(i);
                String itemid = row.optString("id");
                JSONArray arry = row.getJSONArray("values");
                if(i == 0){

                }
                else{
                    final int ar = arry.length();
                    final int tot = g + ar ;
                    int h = 0;
                    for (int j = g ; j < tot; j++) {

                        JSONObject rw = arry.getJSONObject(h);
                        String extraName = rw.optString("extraName");
                        String extraId = rw.optString("extraId");
                        if(namechklist.size() > 0){
                            if(namechklist.contains(extraName)){
                                rw.put("isEnabled","1");
                            }
                        }
                        if(nameunchklist.size()>0){
                            if(nameunchklist.contains(extraName)){
                                rw.put("isEnabled","0");
                            }
                        }
                        if(j >= arry.length()){

                        }else{

                           String gh = String.valueOf(priceidslist.get(j));
                           if(gh.equals(extraId)){
                               rw.put("extraPrice",pricelist.get(j));
                           }

                        }
                        h++;
                    }
                    g = arry.length();
                }

            }
            Log.d("chk", "res:last "+jsonArray.toString());
        }
        JSONArray extraArray = obj.getJSONArray("Extras");
        for (int i = 0; i < extraArray.length(); i++) {
            JSONObject rw = extraArray.getJSONObject(i);
            String extraName = rw.optString("extraName");
            String extraId = rw.optString("extraId");
            if(exnamechklist.size() > 0){
                if(exnamechklist.contains(extraName)){
                    rw.put("isEnabled","1");
                }
            }
            if(exnameunchklist.size()>0){
                if(exnameunchklist.contains(extraName)){
                    rw.put("isEnabled","0");
                }
            }
        }

Я только что изменил условие цикла и изменил формат получения значений json, теперь он работает нормально

12
задан grigoryvp 25 March 2009 в 21:27
поделиться

7 ответов

Настолько простой:

def DestinationThread( a ) :
  while True :
    items = q.get()
    func = items[0]
    args = items[1:]
    func(*args)
28
ответ дан 2 December 2019 в 03:10
поделиться

Другая интересная опция состоит в том, чтобы просто передать в лямбде.

q.put(lambda: HandleMsg(1,2))
q.put(lambda: HandleAnother(8, "hello", extra="foo"))

def DestinationThread() :
   while True :
      f = q.get()
      f()
13
ответ дан 2 December 2019 в 03:10
поделиться
from Queue import *
from thread import *
from time import *

q = Queue()

def HandleMsg( arg1, arg2 ) :
  print arg1, arg2

def HandleAnotherMsg( arg1, arg2, arg3 ) :
  print arg1, arg2, arg3

def DestinationThread() :
  while True :
    f, args = q.get()
    f(*args)

start_new_thread( DestinationThread, tuple() )
print "start"
sleep( 1 )
q.put( (HandleMsg, [1, 2]) )
sleep( 1 )
q.put( (HandleAnotherMsg, [1, 2, 3]) )
sleep( 1 )
print "stop"
9
ответ дан 2 December 2019 в 03:10
поделиться

Я использовал подобную конструкцию прежде:

class Call:
    def __init__(self, fn, *args, **kwargs):
        self.fn = fn
        self.args = args
        self.kwargs = kwargs

    def __call__(self):
        return self.fn(*self.args, **self.kwargs)


x = Call(zip, [0,1], [2,3], [4,5])

Необходимо затем смочь передать x другому потоку и назвать его оттуда:

x() # returns the same as zip([0,1], [2,3], [4,5])
2
ответ дан 2 December 2019 в 03:10
поделиться

Можно создать абстрактный класс сообщений с методом выполнения. Затем для каждой функции, которая должна быть передана через очередь, подкласс и реализовать функцию как метод выполнения. Передающий поток создаст экземпляр надлежащего sub класса и поместит его в очередь. Поток получения получит объект от очереди и вслепую выполнит метод выполнения.

Это обычно называют Шаблоном "команда" (Gamma и др.)

Пример:

class Message (object):
    """abstract message class"""
    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def run(self):
        pass


class MessageOne (Message):
    """one message class"""
    def run(self):
         # perform this emssage's action using the kwargs

Отправитель инстанцирует и отправит сообщение:

queue.put(MessageOne(one='Eins', two='Deux'))

Получатель просто получает объект сообщения, и выполните выполненный метод (не имея необходимость к нему.. еще.. через доступные типы сообщений):

msg = queue.get()
msg.run()
0
ответ дан 2 December 2019 в 03:10
поделиться

Это кажется, что Вы хотите использовать apply() внутренний или его преемник:

def f(x. y):
   print x+y

args = ( 1, 2 )

apply(f, args)   # old way

f(*args)        # new way
0
ответ дан 2 December 2019 в 03:10
поделиться

Почему Вы не разделяете Очередь на подклассы?


class MyQueue(Queue):
  # by using *args, you can have a variable number of arguments
  def put(self,*args):
    for arg in args:
       Queue.put(self,arg)

или, почему Вы не помещаете список?


list = [function_obj]
for arg in function_args:
   list.append(arg)
queue.put(list)
-2
ответ дан 2 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: