Python 多处理类型错误';str';对象不可调用

Python 多处理类型错误';str';对象不可调用,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我对python的多处理库的理解有限,这可能是一个愚蠢的问题,但现在开始 我正试图编写一个程序,利用多处理来保持一个30分钟超时的连接。因此,您必须每29分钟接触一次服务器。我的目标是编写一个连接工作者,它唯一的工作就是睡眠29分钟,醒来触摸服务器,然后返回睡眠状态。我使用的是一个全局连接对象,因此我不必在工作者之间传递该对象。我只是想让每一项工作都独立完成它所需要的工作。工作线程将是一个重载线程,它的睡眠时间与连接线程的睡眠时间不同,它的睡眠时间可以从24小时到6分钟不等。因此,我希望使用多处

我对python的多处理库的理解有限,这可能是一个愚蠢的问题,但现在开始

我正试图编写一个程序,利用多处理来保持一个30分钟超时的连接。因此,您必须每29分钟接触一次服务器。我的目标是编写一个连接工作者,它唯一的工作就是睡眠29分钟,醒来触摸服务器,然后返回睡眠状态。我使用的是一个全局连接对象,因此我不必在工作者之间传递该对象。我只是想让每一项工作都独立完成它所需要的工作。工作线程将是一个重载线程,它的睡眠时间与连接线程的睡眠时间不同,它的睡眠时间可以从24小时到6分钟不等。因此,我希望使用多处理将每个进程作为一个进程启动,并让这些进程访问全局连接变量

import multiprocessing
import atexit
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import time
from monitor import *
import sys
import datetime
from datetime import timedelta
import time
from decimal import *
import cx_Oracle


global vcenter_connection 
current_time = ''

hostname = ''
username = ''
password = ''
vcenter_connection = SmartConnect(host = hostname,user = username,pwd = password)
atexit.register(Disconnect, vcenter_connection) 

if __name__ == '__main__':
    #worker_1 = multiprocessing.Process(name='do_work', target=do_work())
    #connection_service = multiprocessing.Process(name='connection_worker', target=connection_worker())
    jobs = ['worker_1()', 'connection_service()']
    for i,job in enumerate(jobs):
         i = multiprocessing.Process(name=job, target = job)
         i.start()

def connection_worker():
   while True:
      current_time = vcenter_connection.CurrentTime()
      print current_time
      time.sleep(29*60)

def do_work():
   while True:
      if vcenter_connection:
         print "You still have connection.. Sleeping for 5 minutes"
         time.sleep(5*60)
      else:   
         print "no connection"
控制台打印出:

pydev debugger: starting (pid: 21175)
job
worker_1()
job
connection_service()
Process worker_1():
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
TypeError: 'str' object is not callable
Process connection_service():
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
TypeError: 'str' object is not callable
新的代码可以正常工作,但它能让所有的动作都按时入睡。睡眠,我需要连接服务和工作来协调工作。这样,连接服务将始终运行。当达到29分钟时,我是否应该使用不同的方法进行报警,但如何独立于该方法睡眠工作线程,是否可以通过多处理同时独立睡眠

import time
from decimal import *
import cx_Oracle


global vcenter_connection 
current_time = ''

hostname = ''
username = ''
password = ''
vcenter_connection = SmartConnect(host = hostname,user = username,pwd = password)
atexit.register(Disconnect, vcenter_connection) 



def connection_service():
   while True:
      current_time = vcenter_connection.CurrentTime()
      print current_time
      time.sleep(29*60)

def do_work():
   while True:
      if vcenter_connection:
         print "You still have connection.. Sleeping for 5 minutes"
         time.sleep(5*60)
      else:   
         print "no connection"

if __name__ == '__main__':
    #worker_1 = multiprocessing.Process(name='do_work', target=do_work())
    #connection_service = multiprocessing.Process(name='connection_worker', target=connection_worker())
    jobs = [('worker_1()', do_work), ('connection_service()', connection_service)]
    for job in jobs:
         i = multiprocessing.Process(name=job[0], target = job[1])
         i.start()

您必须传递
多处理.Process
函数对象。您正在传递字符串:

jobs = ['worker_1()', 'connection_service()']  # Strings.
for i,job in enumerate(jobs):
     i = multiprocessing.Process(name=job, target = job)
这应该是:

jobs = [worker_1, connection_service]
for job in jobs:
     i = multiprocessing.Process(target=job)
其中,
worker\u 1
connection\u service
是在模块顶层定义的功能

如果要保留当前提供的
名称
,可以将列表设置为元组列表:

jobs = [('worker_1()', worker_1), ('connection_service()', connection_service)]
for job in jobs:
     i = multiprocessing.Process(target=job[1], name=job[0])

您必须传递
多处理.Process
函数对象。您正在传递字符串:

jobs = ['worker_1()', 'connection_service()']  # Strings.
for i,job in enumerate(jobs):
     i = multiprocessing.Process(name=job, target = job)
这应该是:

jobs = [worker_1, connection_service]
for job in jobs:
     i = multiprocessing.Process(target=job)
其中,
worker\u 1
connection\u service
是在模块顶层定义的功能

如果要保留当前提供的
名称
,可以将列表设置为元组列表:

jobs = [('worker_1()', worker_1), ('connection_service()', connection_service)]
for job in jobs:
     i = multiprocessing.Process(target=job[1], name=job[0])

因为
multiprocessing.Process()
要求参数
target
使用
函数

if __name__ == '__main__':
    #worker_1 = multiprocessing.Process(name='do_work', target=do_work())
    #connection_service = multiprocessing.Process(name='connection_worker', target=connection_worker())

    # Now jobs contain functions and not strings
    jobs = [worker_1, connection_service]
    for i,job in enumerate(jobs):
         i = multiprocessing.Process(target = job)
         i.start()

因为
multiprocessing.Process()
要求参数
target
使用
函数

if __name__ == '__main__':
    #worker_1 = multiprocessing.Process(name='do_work', target=do_work())
    #connection_service = multiprocessing.Process(name='connection_worker', target=connection_worker())

    # Now jobs contain functions and not strings
    jobs = [worker_1, connection_service]
    for i,job in enumerate(jobs):
         i = multiprocessing.Process(target = job)
         i.start()

无需在for循环中使用
枚举(作业)
。您根本没有使用返回的索引(
i
)。实际上,您只是用调用
multiprocessing.Process
返回的
Process
对象覆盖它。只需在jobs中使用
:啊,你的权利非常感谢你指出这一点,我本打算列举并使用I,但最终没有使用它。我甚至没想过要更改它,谢谢。在for循环中不需要使用
enumerate(jobs)
。您根本没有使用返回的索引(
i
)。实际上,您只是用调用
multiprocessing.Process
返回的
Process
对象覆盖它。只需在jobs中使用
:啊,你的权利非常感谢你指出这一点,我本打算列举并使用I,但最终没有使用它。我甚至没想过要更改它,谢谢。我明白了,我试图将函数名作为字符串对象传递,但我想你做不到。你们帮了大忙,我没有足够的rep到+1,但是+1500给你们,谢谢。我明白了,我试图将函数名作为字符串对象传递,但我猜你们做不到。你们帮了我很大的忙,我没有足够的代表+1,但是+1500谢谢你们。