2013-04-27 13 views
6

का उपयोग कर रहा गणना और बहु ​​का उपयोग कर भूखंडों उत्पन्न करने के लिए कोशिश कर रहा हूँ। लिनक्स पर नीचे दिए गए कोड को सही ढंग से चलाता है, मैक (एमएल) पर लेकिन यह नीचे त्रुटि दे रही है नहीं है,:अजगर rpy2 और matplotlib संघर्ष जब बहु

import multiprocessing 
import matplotlib.pyplot as plt 
import numpy as np 
import rpy2.robjects as robjects 

def main(): 
    pool = multiprocessing.Pool() 
    num_figs = 2 
    # generate some random numbers 
    input = zip(np.random.randint(10,1000,num_figs), 
       range(num_figs)) 

    pool.map(plot, input) 

def plot(args): 
    num, i = args 
    fig = plt.figure() 
    data = np.random.randn(num).cumsum() 
    plt.plot(data) 

main() 

Rpy2 rpy2 == 2.3.1 और आर 2.13.2 है (मैं कर सकता सेगमेंटेशन गलती के बिना किसी भी मैक पर आर 3.0 और rpy2 नवीनतम संस्करण स्थापित नहीं करें)।

त्रुटि है:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 

मैं समझता हूँ कि समस्या क्या कोई भाग्य के साथ है सब कुछ कोशिश की है। मेरी विन्यास है:

Danials-MacBook-Pro:~ danialt$ brew --config 
HOMEBREW_VERSION: 0.9.4 
ORIGIN: https://github.com/mxcl/homebrew 
HEAD: 705b5e133d8334cae66710fac1c14ed8f8713d6b 
HOMEBREW_PREFIX: /usr/local 
HOMEBREW_CELLAR: /usr/local/Cellar 
CPU: dual-core 64-bit penryn 
OS X: 10.8.3-x86_64 
Xcode: 4.6.2 
CLT: 4.6.0.0.1.1365549073 
GCC-4.2: build 5666 
LLVM-GCC: build 2336 
Clang: 4.2 build 425 
X11: 2.7.4 => /opt/X11 
System Ruby: 1.8.7-358 
Perl: /usr/bin/perl 
Python: /usr/local/bin/python => /usr/local/Cellar/python/2.7.4/Frameworks/Python.framework/Versions/2.7/bin/python2.7 
Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby 

कोई विचार?

+1

Rpy2-2.3.6 आज पहले जारी किया गया था। इसे ओएस एक्स – lgautier

+0

लॉरेन पर segfaults को संबोधित करना चाहिए, नए rpy2 संस्करण के लिए बहुत बहुत धन्यवाद। यह अब आर 3.0.0 के साथ खूबसूरती से काम करता है।फिर भी, उपर्युक्त त्रुटि वही रहती है:/ –

उत्तर

6

यह त्रुटि मैक ओएस एक्स पर होती है जब आप मुख्य थ्रेड के बाहर एक जीयूआई ऑपरेशन करते हैं, जो कि आप अपने प्लॉट फ़ंक्शन को मल्टीप्रोसेसिंग में स्थानांतरित करके कर रहे हैं। (मुझे लगता है कि यह विंडोज पर भी काम नहीं करेगा इसी कारण से - चूंकि विंडोज़ की एक ही आवश्यकता है)। एक ही रास्ता है कि मैं यह काम कर रहा पूल उपयोग कर रहा है डेटा उत्पन्न करने के लिए कल्पना कर सकते हैं, तो डेटा है कि वापस आ रहा है के लिए एक पाश में अपने मुख्य थ्रेड प्रतीक्षा (एक कतार तरह से मैं आमतौर पर इसे संभाल ... है) है।

यहाँ एक उदाहरण (यह मानते हुए कि यह आप क्या चाहते हैं नहीं कर सकते है - साजिश सभी आंकड़े "एक साथ?" - plt.show() ब्लॉक तो केवल एक ही एक समय में तैयार की है और मैं ध्यान दें कि आप की जरूरत नहीं है कि यह आपके नमूना कोड में है - लेकिन बिना मुझे अपनी स्क्रीन पर कुछ भी दिखाई देता है - हालांकि, अगर मैं इसे बाहर ले जाता हूं - वहां कोई अवरोधन नहीं है और कोई त्रुटि नहीं है क्योंकि सभी जीयूआई फ़ंक्शन मुख्य थ्रेड में हो रहे हैं):

import multiprocessing 
import matplotlib.pyplot as plt 
import numpy as np 
import rpy2.robjects as robjects 

data_queue = multiprocessing.Queue() 


def main(): 
    pool = multiprocessing.Pool() 
    num_figs = 10 

    # generate some random numbers 
    input = zip(np.random.randint(10,10000,num_figs), range(num_figs)) 
    pool.map(worker, input) 

    figs_complete = 0 
    while figs_complete < num_figs: 
     data = data_queue.get() 
     plt.figure() 
     plt.plot(data) 
     plt.show() 
     figs_complete += 1 

def worker(args): 
    num, i = args 
    data = np.random.randn(num).cumsum() 
    data_queue.put(data) 
    print('done ',i) 

main() 

इस मदद करता है आशा है।

1

यह rpy2 विशिष्ट हो सकता है। ओएस एक्स और here और there बहु के साथ एक समान समस्या का रिपोर्ट नहीं है।

मैं एक प्रारंभकर्ता कि संकुल साजिश समस्या (multiprocessing-doc) का समाधान कर सकता में कोड चलाने के लिए आवश्यक का आयात करता है का उपयोग करते हुए कि लगता है।

5

मुझे अपने कार्यकर्ता के साथ एक ही समस्या थी, जो कुछ डेटा लोड कर रहा था, एक साजिश उत्पन्न कर रहा था, और इसे फ़ाइल में सहेज रहा था। ध्यान दें कि ओपी के मामले की तुलना में यह थोड़ा अलग है, जो कि इंटरैक्टिव प्लॉटिंग के आसपास उन्मुख है। फिर भी, मुझे लगता है कि यह प्रासंगिक है।

मेरे कोड का एक सरलीकृत संस्करण:

def worker(id): 
    data = load_data(id) 
    plot_data_to_file(data) # Generates a plot and saves it to a file. 

def plot_something_parallel(ids): 
    pool = multiprocessing.Pool() 
    pool.map(worker, ids) 

plot_something_parallel(ids=[1,2,3]) 

इस वजह से एक ही गलती दूसरों का उल्लेख:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 

सोचा था की @ bbbruce की ट्रेन के बाद, मैं से matplotlib बैकएंड स्विच करके मेरी समस्या हल डिफ़ॉल्ट रूप से TKAgg। विशेष रूप से, मैंने अपनी matplotlibrc फ़ाइल में निम्न पंक्ति पर टिप्पणी की:

#backend : TkAgg 
+0

यह मेरी समस्या थी, इसलिए पोस्टिंग के लिए धन्यवाद, भले ही यह ओपी का मुद्दा नहीं है :)। जिज्ञासा से बाहर - कोई विचार * क्यों * बैकएंड बदलना चीजों को ठीक करता है? मेरा बैकएंड 'macosx' पर डिफॉल्ट कर रहा था, इसलिए ऐसा लगता है कि यह मुद्दा' TkAgg' बैकएंड (जब मैंने टिप्पणी की थी, चीजें काम की थीं) के लिए विशिष्ट नहीं है। – dwanderson

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