English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Métodos para usar multihilo en funciones de devolución de llamada de Python

下面的demo是根据需求写的简单测试脚本

#!/usr/bin/env python
# coding: utf-8
# 第一个列表为依赖组件和版本号,后面紧跟负责人名称
# 接着出现第二个以来组建列表,负责人为空了
# 所以根据需求需要对组件、版本号、负责人进行不同处理
# 这时在for循环中根据if判断,写回调函数处理
# 格式不一致数据的测试数据
a = [[u'tool-1", u"1.9.13'], u'xiaowang', u'xiaoqu', [u'tool-2", u"1.9.23'], [u'tool-3", u"1.9.33'], [u'tool-4", u"1.9.43'], u'pi',[u'tool-5", u"1.9.53']]
# a = [[u'tool-1", u"1.9.13'],u'xiaowang',[u'tool-2", u"1.9.23'],u'xiaowang', [u'tool-3", u"1.9.33'],u'xiaowang']
# a = [[u'tool-1", u"1.9.13']]
# [u'tool-1", u"1.9.13"
your_pro = a[0]
# print your_pro
# [u'xiaowang', u'xiaoqu', [u'tool-2", u"1.9.23']]
tmp = a[1:]
# print tmp
def git_callback(whole_v, proj_value, name_value):
  # 如果存在负责人存在
  try:
    if type(name_value[0]) is unicode:
      # 对除去列表0个索引的数据(依赖名和版本号)后面的数据进行遍历
      for i in name_value:
        # 碰到后面的数据是列表的进行回调
        if type(i) is list:
          tmp_index = whole_v.index(i)+1
          return git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:])
        else:
          # 打印依赖、版本号 负责人 开始
          print proj_value+i.split()+['start']
    else:
      # 如果负责人后跟的组件这种格式的列表数据为空
      # 也就是只有依赖和版本号列表数据,负责人为空,就打印依赖版本号
      ver = proj_value
      owner = name_value
      if type(owner[0]) is unicode:
        return git_callback(whole_v, ver, owner)
      else:
        print ver
        # 这里是为了判断是不是到列表的最后一位
        # 如果是最后一个值,且不是字符串的Unicode,而是列表
        # 就直接打印出项目
        if whole_v.index(owner[0]) == len(whole_v)-1:
          # 打印最后一个值
          print whole_v[-1:]
        else:
          # 这里比较绕,打印调试吧...
          new_ver = whole_v[whole_v.index(ver)+1]
          owner = whole_v[whole_v.index(ver)+2:]
          return git_callback(whole_v, new_ver, owner)
  except IndexError as e:
    print proj_value
    print e
git_callback(a, your_pro, tmp)

demo的output:

Boom:git_response pirogue$ python test.py
[u'tool-1", u"1.9.13', u'xiaowang', 'start"
[u'tool-1", u"1.9.13', u'xiaoqu', 'start"
[u'tool-2", u"1.9.23"
[u'tool-3", u"1.9.33"
[u'tool-4", u"1.9.43', u'pi', 'start"
[u'tool-5", u"1.9.53"
list index out of range

python的多线程

El siguiente código es un fragmento de código extraído del programa principal.

from multiprocessing.dummy import Pool as ThreadPool
# Determinar el formato único de los datos de respuesta de la consulta git de retroalimentación
def git_callback(whole_v, proj_value, name_value, git_cookie):
  # 
  whole_v = whole_v
  list_git = []
  if name_value:
    # print name_value
    for i in name_value:
      # print i
      if i:
        if type(i) is list:
          tmp_index = whole_v.index(i)+1
          return git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:], git_cookie)
        else:
          git_cookie = str(git_cookie.split()[0])+"'"+str(git_cookie.split()[1]
          list_git.append(tuple(git_cookie.split("?")+i.split()))
          print list_git
          pool = ThreadPool(100)
          result = pool.map(pool_git, list_git)
          print result
          pool.close()
          pool.join()          
  else:
    print proj_value

El fragmento de código de multihilo superior es una función de retroalimentación, no se ha modificado completamente según el demo. No es difícil modificarlo según las necesidades, simplemente hay que hacer más depuración.

Recibir múltiples parámetros en el multihilo de Python

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(100)
result = pool.map(pool_git, list_git)
print result
pool.close()
pool.join()

pool_git es la función de llamada de múltiples hilos que necesitas, y list_git es el parámetro que necesita recibir pool_git. Por defecto, pool_git es una función que recibe un solo parámetro.

Pero a menudo diseñamos funciones con lógicas complejas, que necesitan que se ingresen múltiples parámetros en pool_git. En este caso, list_git debe proporcionar una lista compuesta de múltiples tuplas.

En el ejemplo de código proporcionado por extranjeros en Stack Overflow:

def multi_run_wrapper(args):
  return add(*args)
def add(x,y):
  return x+y
if __name__ == "__main__":
  from multiprocessing import Pool
  pool = Pool(4)
  resultados = pool.map(multi_run_wrapper,[(1,2)),(2,3)),(3,4)])
  imprimir resultados
salida
[3, 5, 7]

Hay más preguntas y respuestas en Stack Overflow que te ayudarán a entender mejor:

https://stackoverflow.com/preguntas/5442910/python-multiprocessing-pool-map-para-múltiples-argumentos

Confío en que el inteligente te一定能 entender

Múltiples hilos y múltiples procesos

from multiprocessing.dummy import Pool as ThreadPool

Múltiples hilos de proceso, vinculado a un núcleo de CPU

from multiprocessing import Pool

Múltiples procesos, ejecutándose en múltiples núcleos de CPU

Si no entiendes si una tarea es intensiva en CPU o en IO, entonces usa esta biblioteca y escribe dos importaciones, luego instanciálalas y ejecútalas para ver cuánto tiempo toma, en términos de uso, solo cambia algunas letras al crear el objeto. Intercambio entre Pool y ThreadPool.

Resumen

Resumen: Si no entiendes si una tarea es intensiva en CPU o en IO, entonces usa esta biblioteca y escribe dos importaciones, luego instanciálalas y ejecútalas para ver cuánto tiempo toma, en términos de uso, solo cambia algunas letras al crear el objeto. Intercambio entre Pool y ThreadPool.

Declaración: El contenido de este artículo se obtiene de la red, el derecho de autor pertenece al propietario original, el contenido se contribuye y sube por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de infracción.3Declaración: El contenido de este artículo se obtiene de la red, el derecho de autor pertenece al propietario original, el contenido se contribuye y sube por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará