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