2012-05-10 13 views
6

पर विफल रहता है मैंने लिनक्स पर प्रक्रिया समाप्त होने (multiprocessing लाइब्रेरी) विधि के साथ समस्या को देखा है। मेरे पास multiprocessing लाइब्रेरी के साथ काम करने वाला एप्लिकेशन है लेकिन ... जब मैं विंडोज पर terminate फ़ंक्शन को कॉल करता हूं तो सबकुछ बढ़िया काम करता है, दूसरी ओर लिनक्स इस समाधान के साथ विफल रहता है। प्रक्रिया हत्या का एक स्थानापन्न के रूप में मैंमल्टीप्रोसेसिंग प्रक्रिया समाप्त होने पर लिनक्स

os.system('kill -9 {}'.format(pid)) 

उपयोग करने के लिए मुझे पता है कि यह बहुत स्मार्ट नहीं है मजबूर किया गया था, लेकिन यह काम करता है। तो मैं बस सोच रहा हूं कि यह कोड विंडोज पर क्यों काम करता है, लेकिन लिनक्स पर विफल रहता है।

उदाहरण:

from multiprocessing import Process 
import os 

process=Process(target=foo,args=('bar',)) 
pid=process.pid 
process.terminate() # works on Windows only 

... 

os.sytem('kill -9 {}'.format(pid)) # my replacements on Linux 

मेरे विन्यास: अजगर 3.2.0 88,445 का निर्माण; लिनक्स-2.6.32-डेबियन-6.0.4

यह मेरे कोड से नमूना है। मुझे उम्मीद है कि यह पर्याप्त होगा।

def start_test(timestamp,current_test_suite,user_ip): 
    global_test_table[timestamp] = current_test_suite 
    setattr(global_test_table[timestamp], "user_ip", user_ip) 
    test_cases = global_test_table[timestamp].test_cases_table 

    test_cases = test_cases*int(global_test_table[timestamp].count + 1) 
    global_test_table[timestamp].test_cases_table = test_cases 
    print(test_cases) 
    print(global_test_table[timestamp].test_cases_table) 

    case_num = len(test_cases) 
    Report.basecounter = Report.casecounter = case_num 

    setattr(global_test_table[timestamp], "case_num", case_num) 
    setattr(global_test_table[timestamp], "user_current_test", 0) 

    try: 
     dbobj=MySQLdb.connect(*dbconnector) 
     dbcursor=dbobj.cursor() 

     dbcursor.execute(sqlquery_insert_progress.format(progress_timestamp = str(timestamp), user_current_test = global_test_table[timestamp].user_current_tes$ 
    except :... 

    for i in range(case_num): 
     user_row = global_test_table[timestamp] 
     current_test_from_tests_table = user_row.test_cases_table[i] 
     unittest.TextTestRunner(verbosity=2).run(suite(CommonGUI.get_address(CommonGUI,current_test_from_tests_table[1], current_test_from_tests_table[2], user$ 
     global_test_table[timestamp].user_current_test = i + 1 
     try: 
      dbobj=MySQLdb.connect(*dbconnector) 
      dbcursor=dbobj.cursor() 

      dbcursor.execute(sqlquery_update_progress.format(progress_timestamp = str(timestamp), user_current_test = global_test_table[timestamp].user_current$ 
     except :... 

@cherrypy.expose() 
def start_test_page(self, **test_suite): 
    timestamp = str(time.time()) 
    user_ip = cherrypy.request.remote.ip 
    if on_server(): 
     sys.stdout=sys.stderr=open("/var/log/cherrypy/test_gui/{file}.log".format(file=timestamp),"a") 
    current_test_suite = self.parse_result(**test_suite) 
    #global_test_table[timestamp] = current_test_suite 
    #setattr(global_test_table[timestamp], "user_ip", user_ip) 
    user_test_process = Process(target=start_test, args=(timestamp,current_test_suite,user_ip)) 
    users_process_table[timestamp] = user_test_process 
    user_test_process.start() 
    return '''{"testsuite_id" : "''' + str(timestamp) + '''"}''' 

@cherrypy.expose() 
def stop_test(self, timestamp): 
    if timestamp in users_process_table: 
     if on_server(): 
      user_process_pid = users_process_table[timestamp].pid 
      os.system("kill -9 " + str(user_process_pid)) 
     else: 
      users_process_table[timestamp].terminate() 
     del users_process_table[timestamp] 
    else: 
     return "No process exists" 
+0

क्या आप अपना अधिक कोड पोस्ट कर सकते हैं? यह जानना सहायक होगा कि फू बार के साथ क्या कर रहा है, और इससे हम शायद बेहतर विचार प्राप्त करेंगे कि लिनक्स क्यों नहीं मार रहा है, लेकिन विंडोज़ है। – parselmouth

उत्तर

5
docs से

:

समाप्त()

प्रक्रिया समाप्त करें। यूनिक्स पर यह सिगरेट सिग्नल का उपयोग करके किया जाता है; विंडोज टर्मिनेट प्रोसेस() पर प्रयोग किया जाता है। ध्यान दें कि हैंडलर और अंततः खंड, आदि से बाहर निकलें, निष्पादित नहीं किया जाएगा।

ध्यान दें कि प्रक्रिया की वंशज प्रक्रिया समाप्त नहीं की जाएगी - वे आसानी से अनाथ हो जाएंगे।

तो ऐसा लगता है कि आपको यह सुनिश्चित करना होगा कि आपकी प्रक्रिया सही ढंग से SIGTERM सिग्नल को संभालती है।

सिग्नल हैंडलर सेट करने के लिए signal.signal का उपयोग करें।

एक SIGTERM संकेत हैंडलर कि बस प्रक्रिया मौजूद सेट करने के लिए, का उपयोग करें:

import signal 
import sys 
signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1)) 

संपादित

एक अजगर प्रक्रिया सामान्य रूप से SIGTERM पर समाप्त हो जाता है, मैं नहीं जानता कि क्यों अपनी बहु प्रक्रिया नहीं करता है SIGTERM पर समाप्त नहीं होगा।

0

नहीं वास्तव में अपने प्रश्न के लिए एक सीधा जवाब है, लेकिन जब से तुम धागे के साथ काम कर रहे हैं यह सहायक के रूप में अच्छी तरह से हो सकता है उन लोगों के धागे डीबगिंग के लिए: https://stackoverflow.com/a/10165776/1019572 मैं हाल ही में इस कोड का उपयोग cherrypy में एक बग मिला।

संबंधित मुद्दे